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的序列化和反序列化.创建一 ...
随机推荐
- fixed定位文本框引发的问题
<!-- 代码段1 --> <body> <!-- 可以滚动的区域 --> <main id="J_box"> <!-- 内容 ...
- HDU.4903.The only survival(组合 计数)
题目链接 惊了 \(Description\) 给定\(n,k,L\),表示,有一张\(n\)个点的无向完全图,每条边的边权在\([1,L]\)之间.求有多少张无向完全图满足,\(1\)到\(n\)的 ...
- Django——发送邮件
Django--发送邮件 在web应用中,服务器对客户发送邮件来通知用户一些信息,可以使用邮件来实现. Django中提供了邮件接口,使我们可以快捷的建设一个邮件发送系统. 以下是一个简单实例: se ...
- 全是Bug
一.开始实现程序之前 1. 在文章开头给出结对使用的Github项目地址和结对伙伴的作业地址.(两个人使用同一个) 我的结对伙伴是 : 201731044205. 伙伴的作业地址: https://w ...
- Linux内核笔记:epoll实现原理(一)
一.说明 针对的内核版本为4.4.10. 本文只是我自己看源码的简单笔记,如果想了解epoll的实现,强烈推荐下面的文章: The Implementation of epoll(1) The Imp ...
- [LeetCode] Insert into a Cyclic Sorted List 在循环有序的链表中插入结点
Given a node from a cyclic linked list which is sorted in ascending order, write a function to inser ...
- tp5 查询单个字段的值
$num_lastday = Db::name('test_wx') ->where('num','=',$data['num']) ->order('time desc') ->l ...
- 如何关闭git pull产生的merge 信息
编辑 ~/.gitconfig [core] mergeoptions = --no-edit 或者终端之行 git config --global core.mergeoptions --no-ed ...
- java第二次作业之一
package dama; public class person { private String name; private String sex; private int age; privat ...
- 第五周ip通信基础回顾
广播请求,单播响应,ARP IPV4,IP地址32位二进制代码分为8个位一组 路由器每一个接口都是一个网段 ,网段与网段区分看网络地址 同一段链路是同网段 直接广播:主机号全为1 受限广播:全为1 特 ...