资讯专栏INFORMATION COLUMN

仿造 Gson 的自制 json 解析器

tianren124 / 3046人阅读

摘要:在测试当中兼容性表现良好,但是执行效率不如预期不及,笔者一度想要放弃该项目,但是造轮子不易,既然造了就稍微聊一聊吧,欢迎探讨进步。是一个中的接口,使用者可以自行实现该接口用以解析需要的类型,作用类似中的自定义的功能仅为预留,暂未做支持。

零 引子 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,批量设置忽略字符
        .addIgnoreChars(chars)
        //在 json 字符串反序列化过程中需要识别的日期格式,默认仅有一种 yyyy-MM-dd HH:mm:ss
        .addReadDateFormat("yyyy-mm-dd")
        //传入一个 List,批量设置识别的日期格式
        .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 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,如果字符串本身是一个列表的话会报错
//不传入 readManager,配置均使用默认
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);

//第一个参数为要序列化的对象
//第二个参数是 writeManager
JWriter jWriter = new JWriter(object,writeManager);
//只传入对象,不传入 writeManager,配置均使用默认
JWriter jWriter1 = new JWriter(object);

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

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

//json 字符串的反序列化过程
Object obj = JSONBootstrap.read(jsonString);
//加入指定类型的反序列化
T obj = JSONBootstrap.read(jsonString,class);
//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 造轮子使我快乐

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77413.html

相关文章

  • 追踪解析Gson源码(1)

    摘要:版本版本简介是谷歌开源的解析工具。其实几款产品的差别都很细微,有谷歌的信仰加成,所以在这里进行一次源码分析。至于和会在后续进行追踪。 零 前期准备 0 FBI WARNING 文章异常啰嗦且绕弯。 1 版本 Gson 版本 : gson 2.8.5 IDE : idea 2018.3 2 Gson 简介 Gson 是谷歌开源的 java json 解析工具。市场上同类的开源产品还有 F...

    sewerganger 评论0 收藏0
  • 追踪解析Gson源码(2)

    摘要:接上篇三和在进行的序列化和反序列化源码解析之前先了解一下其主体工具类。是中用于序列化的主体。同时为了兼顾性能做了很多有意思的设计,比如获取适配器的时候的双缓存设计,应该是为了提高解析器的复用效率,具体有待研究。 接上篇 三 JsonReader 和 JsonWriter 在进行 json 的序列化和反序列化源码解析之前先了解一下其主体工具类。 1 JsonReader JsonRead...

    shiguibiao 评论0 收藏0
  • java解析和创建JSON

    摘要:概述即,是对象表示法的子集。具有以下特点数据放在键值对中数据由逗号分隔花括号表示对象方括号表示数组。创建一个对象为对象添加属性创建数组将对象添加到数组将数组添加到对象将对象转化成字符串参考文档官网 JSON概述 JSON即javascript object notation,是javascript对象表示法的子集。具有以下特点: 数据放在键值对中; 数据由逗号分隔; 花括号表示对...

    邹强 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<