零 引子

0 源码

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 造轮子使我快乐

java litjson_仿造 Gson 的自制 json 解析器相关推荐

  1. Gson:GitHub 标星 18K 的 JSON 解析器,Google 出品的 Java JSON 解析器,强烈推荐!

    01.前世今生 我叫 Gson,是一款开源的 Java 库,主要用途为序列化 Java 对象为 JSON 字符串,或反序列化 JSON 字符串成 Java 对象.从我的名字上,就可以看得出一些端倪,我 ...

  2. java json parser_自己实现JSON解析器 JsonParser

    自己实现json parser,只有一个类,不依赖任何第三方工具. 背景 为什么要实现json解析器呢?在我实现一个rpc框架的过程中,注册中心部分使用consul,而consul的api是通过res ...

  3. java json解码器_Jackson:我是最牛掰的 Java JSON 解析器(有点虚)

    在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪. 很不幸的是,JDK 没有 JSON 库,不知道为什么不搞一下.L ...

  4. Jackson:我是最牛掰的 Java JSON 解析器(有点虚)

    在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪. 很不幸的是,JDK 没有 JSON 库,不知道为什么不搞一下.L ...

  5. spring boot2 修改默认json解析器Jackson为fastjson

    fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:spring ...

  6. 手把手教你实现一个 JSON 解析器!

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等. 在 ...

  7. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  8. json解析对应的value为null_徒手撸一个JSON解析器

      Java大联盟 致力于最高效的Java学习 关注 作者 | 田小波 cnblogs.com/nullllun/p/8358146.html1.背景JSON(JavaScript Object No ...

  9. flex bison解析json文件_每秒解析千兆字节的 JSON 解析器开源了

    本文转自我们的网站 InfoQ,译者无明.除了推荐 simdjson 之外,还想测试一下微信平台编辑器的代码样式功能. 事实证明,微信文章的代码展示能力很强了.非常棒. 近日,GitHub 开源了一 ...

最新文章

  1. 为什么权重初始化要非对称?为什么权重初始化不能全为0?为什么初始化值不能太大或者太小?介绍下He初始化以及Xavier初始化?
  2. 高效编程之互斥锁和自旋锁
  3. 2.9 什么是端到端的深度学习-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  4. 通过超分辨率重构来提高二维码的对比度
  5. 使用Turi Create训练核心ML模型以对犬种进行分类
  6. ES6——Map和WeakMap
  7. php页面运用文本编辑器的实例,TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析...
  8. networkxpdf_1 NetworkX概述
  9. 前端模块打包工具--webpack
  10. (XWZ)的Python学习笔记Ⅲ——面向对象高级编程
  11. 腾讯云认证证书——云计算行业的敲门砖
  12. 记一次JPA项目启动速度优化
  13. mysql 判断邮箱_Java 判断电话号码邮箱代码示例讲解
  14. 如何让Bing(必应)快速收录你的网站
  15. offset 和 零点的一点解释
  16. Quick Viewer 快速浏览器
  17. 掌握python和js_新华字典:掌_“掌”的意思,五笔,笔画,拼音,五行_HttpCN
  18. matlab用diag直接使用错误_Matlab diag的用法
  19. Pulsar Summit Asia 2020 中文专场议题出炉!
  20. MC9S12G128模块化分层化软件架构之六——KEY

热门文章

  1. 隐藏控制台程序的窗口
  2. 在Windows下编译OpenSSL(VS2005)【转】
  3. SqlServer命名规范
  4. PaddlePaddle飞桨OCR文本检测——入门安装GPU版(一)
  5. ai二维码插件_超实用的AI脚本插件合集2.0免费分享,让你的设计快人一步
  6. 外贸常用术语_外贸常用贸易术语之间,要这么换算……
  7. MySQL的安装、启动、停止、卸载
  8. mysql 无法创建用户_无法在MySQL 5.6中创建用户
  9. 接口测试常用工具及测试方法(超全)干货
  10. 百万年薪挖了个P7程序员,难道是“水货”?