仿造 Gson 的自制 json 解析器

栏目: 服务器 · 发布时间: 6年前

内容简介:已上传 githubMaven : 3.3.9 (主要用作打包工具)

零 引子

0 源码

已上传 github

https://github.com/mikylin-pr...

1 开发依赖

Maven : 3.3.9 (主要用作打包工具)

IDE : idea 2018.3

JDK : OpenJDK 11.0.1 (OracleJDK 8 以上即可)

2 写在前头

Litjson 是笔者读了 Gson 源码之后的业余之作,基本思路仿造了 Gson,但是功能上做了不少精简,仅仅能适用于比较标准的 json 字符串和 java 对象的互转。

Litjson 在测试当中兼容性表现良好,但是执行效率不如预期(不及 Gson),笔者一度想要放弃该项目,但是造轮子不易,既然造了就稍微聊一聊吧,欢迎探讨进步。

一 自定义配置

Litjson 可以使用组件 OptionBox 进行各种参数的修改,OptionBox 由其静态内部类 OptionBoxBuildr 创建:

//创建一个 builder
OptionBox.OptionBoxBuilder boxBuilder = OptionBox.OptionBoxBuilder.builder();

//使用 builder 创建 OptionBox
OptionBox box = boxBuilder
        //在 json 字符串反序列化过程中要忽略的字符
        //默认会忽略空字符串和换行符等字符类型
        .addIgnoreChar('c')
        //传入一个 List<Character>,批量设置忽略字符
        .addIgnoreChars(chars)
        //在 json 字符串反序列化过程中需要识别的日期格式,默认仅有一种 yyyy-MM-dd HH:mm:ss
        .addReadDateFormat("yyyy-mm-dd")
        //传入一个 List<DateFormat>,批量设置识别的日期格式
        .addReadDateFormats(dateformats)
        //TypeHandler 为类型转换器
        //使用者可以自定义需要使用的类型转换器,并以 map 的格式传入
        //默认只有 Integer/Long/String/Double/Float/Date 这几种类型
        .addTypeHandlers(handlerMap)
        //在将 java bean 序列化的过程中使用单引号还是双引号
        //true 为双引号,false 为单引号,不设置的时候默认为 true
        .isQoubleQuotationMarks(true)
        //在将 java bean 序列化的过程中需要转的日期格式
        //默认为 yyyy-MM-dd HH:mm:ss
        .writeDateFormat(dateformat)
        //创建 OptionBox
        .over();

OptionBox 的功能目前较少,后期添加。

TypeHandler 是一个 Listjson 中的接口,实现该接口就可以完成使用者需要进行解析的类型,作用类似 Gson 中的 TypeAdapter:

public interface TypeHandler<T> {

    T read(String value);

    String write(T t);
}

!!!自定义 TypeHandler 的功能仅为预留,暂未做支持。

二 反序列化

JReader 是 Litjson 中用于读取 json 字符串(反序列化)的组件,提供多种重载方法进行创建:

//配置盒
OptionBox box = OptionBox.OptionBoxBuilder.builder().over();
//JReader 的辅助 工具 类,使用配置盒进行创建
ReadManager readManager = new ReadManager(box);

//第一个参数为 json 字符串
//第二个参数是需要读成的 java class 类型
//第三个参数表示 是否为列表,true 代表是列表,false 代表是 object
//如果第三个参数为 true,则 classType 会表示成列表内的泛型类型
//第四个参数是 readManager
JReader jReader = new JReader(jsonString,classType,true,readManager);
//只传入 json 字符串,会输出一个 map,如果字符串本身是一个列表的话会报错
JReader jReader1 = new JReader(jsonString);
//同上,只是会输出成一个 java class 类型
JReader jReader2 = new JReader(jsonString,classType);
//输出成一个列表
JReader jReader3 = new JReader(jsonString,classType,true);

//输出对象
Object o = jReader.toObj();
//输出列表对象
List list = jReader.toArray();

三 序列化

JWriter 是 Litjson 中用于输出 json 字符串(序列化)的组件,提供多种重载方法进行创建:

//配置盒
OptionBox box = OptionBox.OptionBoxBuilder.builder().over();
//JWriter 的辅助工具类,使用配置盒进行创建
WriteManager writeManager = new WriteManager(box);

//第一个参数为要序列化的对象
//第二个参数是 readManager
JWriter jWriter = new JWriter(object,writeManager);
//只传入对象
JWriter jWriter = new JWriter(object);

//输出 json 字符串
String json = jWriter.toJson();

四 门面

介于一般情景下快速开发的需求,笔者参考了 Fastjson 的使用之后给 JReader 和 JWriter 设置了一个统一静态门面类供使用者更加方便的调用:

//json 字符串的反序列化过程
Object obj = JSONBootstrap.read(jsonString);
//加入指定类型的反序列化
T obj = JSONBootstrap.read(jsonString,class<T>);
//java bean 序列化过程
String json = JSONBootstrap.write(obj);

五 一点唠叨

0 截止到 version 0.0.1,使用 IDEA 的 Statistic 插件统计共计约 2400 行 java 代码

1 Litjson 的使用需要使用到 java bean 的无参构造器和参数的 get/set 方法,没有的话在反射创建阶段就会报错

2 现阶段支持的类型还很少,只能支持 java bean/Map/Collection/Integer/Long/Float/Double/String/Date

3 高并发下的 DateFormat 存在线程安全问题

4 笔者对项目整体性把握的功力还太浅,体现在对象封装、错误管理等各方面,有待后期完善

5 春节假期的自 high 作品,随缘维护,谨慎用于生产环境

6 造轮子使我快乐

以上所述就是小编给大家介绍的《仿造 Gson 的自制 json 解析器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bulletproof Web Design

Bulletproof Web Design

Dan Cederholm / New Riders Press / 28 July, 2005 / $39.99

No matter how visually appealing or packed with content a Web site is, it isn't succeeding if it's not reaching the widest possible audience. Designers who get this guide can be assured their Web site......一起来看看 《Bulletproof Web Design》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试