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的序列化和反序列化.创建一 ...
随机推荐
- 【转】C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子. 标签: c#objectnewlineexceptionbytestring 2010-05-17 01:10 117109人阅读 ...
- Cadence OrCAD Cpature创建Title Block
为了统一部门设计文档的管理,需要对文档命名.设计文件符号.设计文件规范做出规定.这里介绍下Cadence OrCAD Cpature原理图设计中创建满足自己的Title Block. 1.创建库文件 ...
- PHP文件上传大小限制问题
一.Thinkphp方面限制 $upload->maxSize = 31457280 ; //设置附件上传大小 二.七牛方面限制: 'UPLOAD_FILE_QINIU' => ...
- CentOS下 SVN版本控制的安装(包括yum与非yum)的步骤记录。
一.yum安装 rpm -qa subversion //检查是否安装了低版本的SVN yum remove subversion //如果存储旧版本,卸载旧版本SVN 开始安装 yum -y ins ...
- __x__(7)0905第二天__HTML的发展
HTML的发展 浏览器各个厂商有不同的标准,一个网页的兼容性非常差. 于是,W3C出来了,作为公益组织定义了HTML标准. 在 1993.6 实现并发布了第一个 HTML. 在 1995.11 开始创 ...
- ssh 免密登录
一,单机秘密登录 进入/etc/ssh 文件夹 编辑sshd_config 文件(sshd_config是ssh 服务端文件,ssh_config是客户端文件) sudo vi sshd_config ...
- 输入正整数n,求各位数字和
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/5 10:24 * @description ...
- 与postman的第一次亲密接触
postman和JMeters是外部接口测试的两个工具,通过界面化的方法,来实现操作http报文携带的请求字段.VK值.cookie.header值及文件.本篇主要介绍postman. 首先,补充下 ...
- java基础 第八章课后习题
1.什么是二重循环?在内层循环中使用continue和break语句,程序如何跳转? 答:二重循环就是一个循环结构体内又包含另一个完整的循环结构. continue语句跳转时是跳过了内层循环中的剩余语 ...
- JDK8之The type java.util.Map$Entry cannot be resolved
eclipse+tomcat7+jdk1.6上面报错的方式我的解法方法是吧jre8换成6的就好了选中项目->右键->java build path ->找到jre system li ...