Json常⽤序列化⼯具包⼤⽐拼
⼀、前⾔
Json已成为计算机编程中最常⽤的数据传输和存储格式之⼀,所以对Json的序列化和反序列化⼯具的选择也是互联⽹系统中⽐较重要的环节,尤其在⾼并发下的执⾏效率,可能会直接影响系统的吞吐率。本⽂将从功能和性能两⽅⾯对常⽤的四种Json处理⼯具进⾏对⽐,以便选出符合我们系统需要的Json处理⼯具。
⼆、功能对⽐
项⽬json-lib fastJson Jackson Gson
最新版本号  2.4  1.2.51  2.97  2.8.5
最后更新2010/12/142018/9/302018/9/192018/5/22
被引⽤次数426149251858655
是否⽀持注解No Yes Yes Yes
Map中的key为Long
时报错
正常输出,不是
标准格式
会把key转成
String
会把key转成
String
特殊字符⽀持⽀持⽀持⽀持
控制字符⽀持⽀持⽀持⽀持
表情字符⽀持⽀持⽀持⽀持
从上表可以得出以下结论:
1. Sf的json-lib已经很久没有更新了,其它三种都还⼀直在更新维护
2. 从Maven库中被引⽤的次数来看,sf的json-lib也是使⽤的最少的,⽽Gson和Jackson被使⽤的较多
3. 当对象中包含key为Long类型的Map时,json-lib序列化时会报错,fastJson是正常以整数作为key输出,Jackson和Gson会把key转换
成字符串输出。fastJson的处理⽅式会导致反序列化报错
4. 经测试,四个⼯具包对特殊字符的处理都没有问题
其它说明:
  1、 Jackson、json-lib反序列化时,要求所有涉及的Bean必须存在默认的构造函数
  2、 fastJson、json-lib反序列化,再序列化之后得到的JSON与之前可能不⼀致,因为Map的顺序会变,⽽Jackson、gson反序列化之后是⼀致的,其使⽤了LinkedHashMap保证顺序
  3、 fastJson、Gson输出json时会忽略值为null的字段;对于值为null的字段,jackson输出null,⽽json-lib输出空字符串
  4、 fastJson反序列化时,⼆级对象中的List出现过没有被反序列化的情况,但后来测试⼜可以反序列化了,⽬前还没有到规律
三、性能对⽐
1) 序列化操作
第⼀组:
测试环境:本地Windows、2核8G内存,64位OS
Bean对象:⼩对象,输出Json后约1.83KB
结论:
1. 对于⼩对象的序列化,json-lib在⾼并发的情况下效率明显不如其它三个⼯具,同时json-lib的CPU占⽤率达到100%
2. fastJson、Jackson和Gson对⼩对象的序列化执⾏效率差异不明显,但Jackson更优
第⼆组:
测试环境:本地Windows、2核8G内存,64位OS
fastjson字符串转数组Bean对象:⼤对象,输出Json后约8.99KB
结论:
1. 对于⼤对象,sf的json-lib执⾏效率明显不如其它三个⼯具。在⾼并发的情况下,Jackson的执⾏效率⼏乎是json-lib的10倍;
2. Gson的执⾏效率也明显不如fastJson和Jackson,消耗时间⼏乎是它们的2倍;
3. 执⾏效率上,Jackson优于fastJson
4. Gson对CPU的占⽤率控制的最好,⼀直在80%左右
第三组:
测试环境:本地Windows、2核8G内存,64位OS
Bean对象:特⼤对象,输出Json后约56.1KB。因在⼩对象测试中证明json-lib和gson在⾼并发下效率不好,所以⼤对象测试中忽略这两个包,只对⽐fastjson和jackson。
结论:
1. 执⾏效率上,Jackson优于fastJson。⽹上很多朋友都说fastjson⽐jackson快,可能是使⽤了jackson1.x的缘故,后⾯有时间再测试⼀
下。
2) 反序列化操作
第⼀组:
测试环境:本地Windows、2核8G内存,64位OS
输⼊数据:⼩对象,输⼊Json约1.83KB
总结:
1. 对于⼩⽂件的反序列化,json-lib效率明显不⾏
2. 在⾼并发的情况下,Jackson的效率最优
3. 对于⼩⽂件的反序列化操作,即使⾼并发的情况下,CPU占⽤率也表现⽐较平稳,相对来说fastJson的CPU占⽤率更⾼
第⼆组:
测试环境:本地Windows、2核8G内存,64位OS
输⼊数据:⼤对象,输⼊Json约9.83KB
结论:
1. 对于⼤⽂件的反序列化,json-lib和Gson的执⾏效率明显不如fastJson和Jackson
2. ⾼并发的情况下,Jackson的执⾏效率优于fastJson
第三组:
测试环境:本地Windows、2核8G内存,64位OS
输⼊数据:特⼤对象,输⼊Json约56.1KB
结论:
1. 对于更⼤⽂件的反序列化,json-lib和Gson的执⾏效率明显不如fastJson和Jackson
2. Jackson的执⾏效率优于fastJson,尤其是⾼并发的情况下
四、总结
经过以上测试及对⽐,基本可以得出结论:Jackson⼯具包(测试中使⽤2.9.5版本)在功能和性能⽅⾯都表现的更出⾊,在新开发系统时可以考虑使⽤Jackson进⾏JSON数据的处理。理由如下:
1. Jackson使⽤⼴泛,并且仍然在持续更新
2. Jackson对特殊字符⽀持完好
3. 在序列化和反序列化时,Jackson的性能在测试的4个⼯具包中表现最优,尤其是对⼤⽂件或⾼并发时表现更好。
五、使⽤Jackson的注意事项
在使⽤Jackson时,有⼀些注意事项,需要在编写代码时注意,具体如下:
1)      反序列化时,要求所有涉及的Bean必须存在默认的构造函数,否则会报错;
2)      反序列化时,如果json中有部分字段是对象中不存在的属性,或对象中⽆get/set⽅法,会报“UnrecognizedPropertyException”,解决⽅法是:
  在类中添加 @JsonIgnoreProperties(ignoreUnknown = true),
  或者代码中设置:
  mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
3)      反序列化的类是抽象类或者接⼝,就会导致“Can not construct instance of”这个异常。
  解决⽅法:添加@JsonDeserialize(as = Cat.class)注解
  如下:
  Json⽂件:
  {"id":1001,"name":"布莱德","weight":1.67,"animal":{"color":"Blue"}}
4)      当反序列化的JSON中包含了单引号⽽不是双引号的时候,会抛“Unexpected character (''' (code 39))”异常,
如Json:{"id":1001,"name":'布莱德','weight':1.67, "feild1": 56}
解决⽅法:
JsonFactory factory = new JsonFactory();
ObjectMapper mapper = new ObjectMapper(factory);
六、Jackson从1.x迁移到2.x的步骤
1)      修改POM⽂件
2)      包名更改
所有以dehaus.jackson开头的包名都替换成com.fasterxml.jackson开头的。
3)      设置属性的代码调整
  SerializationConfig.Feature.* 改成 SerializationFeature.*
  DeserializationConfig.Feature.* 改成 DeserializationFeature.*

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。