Json常用序列化工具包大比拼
一、前言
Json已成为计算机编程中最常用的数据传输和存储格式之一,所以对Json的序列化和反序列化工具的选择也是互联网系统中比较重要的环节,尤其在高并发下的执行效率,可能会直接影响系统的吞吐率。本文将从功能和性能两方面对常用的四种Json处理工具进行对比,以便选出符合我们系统需要的Json处理工具。
二、功能对比
项目 |
json-lib |
fastJson |
Jackson |
Gson |
最新版本号 |
2.4 |
1.2.51 |
2.97 |
2.8.5 |
最后更新 |
2010/12/14 |
2018/9/30 |
2018/9/19 |
2018/5/22 |
被引用次数 |
426 |
1492 |
5185 |
8655 |
是否支持注解 |
No |
Yes |
Yes |
Yes |
Map中的key为Long时 |
报错 |
正常输出,不是标准格式 |
会把key转成String |
会把key转成String |
特殊字符 |
支持 |
支持 |
支持 |
支持 |
控制字符 |
支持 |
支持 |
支持 |
支持 |
表情字符 |
支持 |
支持 |
支持 |
支持 |
从上表可以得出以下结论:
- Sf的json-lib已经很久没有更新了,其它三种都还一直在更新维护
- 从Maven库中被引用的次数来看,sf的json-lib也是使用的最少的,而Gson和Jackson被使用的较多
- 当对象中包含key为Long类型的Map时,json-lib序列化时会报错,fastJson是正常以整数作为key输出,Jackson和Gson会把key转换成字符串输出。fastJson的处理方式会导致反序列化报错
- 经测试,四个工具包对特殊字符的处理都没有问题
其它说明:
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
结论:
- 对于小对象的序列化,json-lib在高并发的情况下效率明显不如其它三个工具,同时json-lib的CPU占用率达到100%
- fastJson、Jackson和Gson对小对象的序列化执行效率差异不明显,但Jackson更优
第二组:
测试环境:本地Windows、2核8G内存,64位OS
Bean对象:大对象,输出Json后约8.99KB
结论:
- 对于大对象,sf的json-lib执行效率明显不如其它三个工具。在高并发的情况下,Jackson的执行效率几乎是json-lib的10倍;
- Gson的执行效率也明显不如fastJson和Jackson,消耗时间几乎是它们的2倍;
- 执行效率上,Jackson优于fastJson
- Gson对CPU的占用率控制的最好,一直在80%左右
第三组:
测试环境:本地Windows、2核8G内存,64位OS
Bean对象:特大对象,输出Json后约56.1KB。因在小对象测试中证明json-lib和gson在高并发下效率不好,所以大对象测试中忽略这两个包,只对比fastjson和jackson。
结论:
- 执行效率上,Jackson优于fastJson。网上很多朋友都说fastjson比jackson快,可能是使用了jackson1.x的缘故,后面有时间再测试一下。
2) 反序列化操作
第一组:
测试环境:本地Windows、2核8G内存,64位OS
输入数据:小对象,输入Json约1.83KB
总结:
- 对于小文件的反序列化,json-lib效率明显不行
- 在高并发的情况下,Jackson的效率最优
- 对于小文件的反序列化操作,即使高并发的情况下,CPU占用率也表现比较平稳,相对来说fastJson的CPU占用率更高
第二组:
测试环境:本地Windows、2核8G内存,64位OS
输入数据:大对象,输入Json约9.83KB
结论:
- 对于大文件的反序列化,json-lib和Gson的执行效率明显不如fastJson和Jackson
- 高并发的情况下,Jackson的执行效率优于fastJson
第三组:
测试环境:本地Windows、2核8G内存,64位OS
输入数据:特大对象,输入Json约56.1KB
结论:
- 对于更大文件的反序列化,json-lib和Gson的执行效率明显不如fastJson和Jackson
- Jackson的执行效率优于fastJson,尤其是高并发的情况下
四、总结
经过以上测试及对比,基本可以得出结论:Jackson工具包(测试中使用2.9.5版本)在功能和性能方面都表现的更出色,在新开发系统时可以考虑使用Jackson进行JSON数据的处理。理由如下:
- Jackson使用广泛,并且仍然在持续更新
- Jackson对特殊字符支持完好
- 在序列化和反序列化时,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();
factory.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
ObjectMapper mapper = new ObjectMapper(factory);
六、Jackson从1.x迁移到2.x的步骤
1) 修改POM文件
旧依赖 |
新依赖 |
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.x.x</version> </dependency> |
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.5</version> </dependency> |
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>1.x.x</version> </dependency> |
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.5</version> </dependency> |
2) 包名更改
所有以org.codehaus.jackson开头的包名都替换成com.fasterxml.jackson开头的。
3) 设置属性的代码调整
SerializationConfig.Feature.* 改成 SerializationFeature.*
DeserializationConfig.Feature.* 改成 DeserializationFeature.*
Json常用序列化工具包大比拼的更多相关文章
- C# JSON字符串序列化与反序列化常见模型举例
C#中实体转Json常用的类JavaScriptSerializer,该类位于using System.Web.Script.Serialization;命名空间中,添加引用system.web.ex ...
- json等序列化模块 异常处理
今日学习内容如下: 1.序列化模块 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现 ...
- [译]Flutter JSON和序列化
[译]Flutter JSON和序列化 很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...
- pickle和JSON的序列化
Pickle和JSON的序列化 Python的pickle模块允许我们把对象只节存储成一个特殊的存储格式,它本质上是把一个对象转换成一种可以存储到文件或者类文件对象或者一个字节字符串的格式: > ...
- [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化
[.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...
- 在C#中,Json的序列化和反序列化的几种方式总结
在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...
- C#中的Json的序列化和反序列化
Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...
- Json的序列化与反序列化
对于Json的序列化和反序列化,如果自己编写源代码来实现的话,很复杂很烦,所以我采用的是使用别人已经写好的引用文件.这类文件网上有很多,我用的是LitJson,当然Newtonsoft也可以,但后者需 ...
- Newtonsoft.Json 的序列化与反序列化
首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...
随机推荐
- Hadoop伪分布式的搭建
主要分为三个步骤:1.安装vmware虚拟机运行软件 2.在vmware虚拟机中安装linux操作系统 3.配置hadoop伪分布式环境 Hadoop环境部署-JDK部分------------ ...
- Android的BroadcastReceiver组件
BroadcastReceiver的作用: BroadcastReceiver,是和Intent有很大关系的Android组件. Android中的 Intent 可以用来: 1. 在应用程序内部和应 ...
- 如何设计一个restful风格的API
1.API接口应该尽量兼容之前的版本,在URL上应保留版本号,并同时兼容多个版本 2.每一个URI代表一个资源 3.请求方式要与http请求方式一致,GET(获取),POST(新增),PUT(更新全部 ...
- 02_ if_else if 练习
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- DTcms 模版用vs2015或2017 打开编辑时候 粘贴出问题 代码被调整
因为模版语言不是标准的HTML格式 ,所以HTML粘帖的时候会格式化 导致原标签出问题,这里修改下就可以了
- SQLSERVER 聚集一个表的字段2008及以后,要求支持XML
将以下代码中的TABLE_NAME替换成所需表名称即可. 注意 declare 和set 语句后面不要有 :否则可能执行不成功 declare @S_Column varchar(8000)set @ ...
- 第一次c++作业小结
之前从未接触过c++,上完第一节课后也还是懵懵懂懂.当知道有作业要完成时,也是无从下手.在仔细阅读教材以及同学的帮助下,我了解了如何编写最简单的程序,也算是踏入c++的大门.希望自己的第一次作业能够符 ...
- overflow:hidden;和clear:both;的不同点
overflow:hidden;是针对被浮动元素的父级元素,是让父级元素找回原来的高,因为浮动的元素会让父级元素的高塌陷: 而clear:both:它是在新的元素上面书写,它是让上面浮动的元素不要干扰 ...
- 获取APP应用的包名信息
语言: python 3.7 需求:获取APP的包名和程序入口信息,以便在 Appium 脚本中配置 appPackage 和 appActivity 参数. 场景一 资源:已有APP应用的apk安装 ...
- hue,kylin,ambari
apache-kylin https://ambari.apache.org/ https://www.jianshu.com/p/c49c61b654da docker pull sequencei ...