一、前言

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

特殊字符

支持

支持

支持

支持

控制字符

支持

支持

支持

支持

表情字符

支持

支持

支持

支持

从上表可以得出以下结论:

  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

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();

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常用序列化工具包大比拼的更多相关文章

  1. C# JSON字符串序列化与反序列化常见模型举例

    C#中实体转Json常用的类JavaScriptSerializer,该类位于using System.Web.Script.Serialization;命名空间中,添加引用system.web.ex ...

  2. json等序列化模块 异常处理

    今日学习内容如下: 1.序列化模块 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现 ...

  3. [译]Flutter JSON和序列化

    [译]Flutter JSON和序列化   很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...

  4. pickle和JSON的序列化

    Pickle和JSON的序列化 Python的pickle模块允许我们把对象只节存储成一个特殊的存储格式,它本质上是把一个对象转换成一种可以存储到文件或者类文件对象或者一个字节字符串的格式: > ...

  5. [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  6. 在C#中,Json的序列化和反序列化的几种方式总结

    在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (JavaScript Object Notation) ...

  7. C#中的Json的序列化和反序列化

    Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...

  8. Json的序列化与反序列化

    对于Json的序列化和反序列化,如果自己编写源代码来实现的话,很复杂很烦,所以我采用的是使用别人已经写好的引用文件.这类文件网上有很多,我用的是LitJson,当然Newtonsoft也可以,但后者需 ...

  9. Newtonsoft.Json 的序列化与反序列化

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

随机推荐

  1. 【AtCoder】【模型转化】【二分答案】Median Pyramid Hard(AGC006)

    题意: 给你一个排列,有2*n-1个元素,现在进行以下的操作: 每一次将a[i]替换成为a[i-1],a[i],a[i+1]三个数的中位数,并且所有的操作是同时进行的,也就是说这一次用于计算的a[], ...

  2. 在Linux下用gcc编译hello world

    1. 确保Linux系统里已经装好了gcc 测试:输入gcc后是如下的结果就说明已经安装成功 2. 创建HelloWorld.c 使用 touch 创建一个空文件; 用vim编辑 按下A或者I 插入 ...

  3. Linux 内核参数 arp_ignore & arp_announce 详解

    arp_ignore定义了对目标地址为本机IP的ARP询问的不同应答模式. arp_announce对网络接口(网卡)上发出的ARP请求包中的源IP地址作出相应的限制:主机会根据这个参数值的不同选择使 ...

  4. 10_ for 练习 _ is Prime Number ?

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. jquery运用FormData结合Ajax异步上传表单,超实用

    首先创建一个formData,其中参数,就是你的form表单,jquery要加0,也可以用document.querySelector("form")得到 var formData ...

  6. eclipse spring-boot-mybatis 的记录

    例子来源: https://gitee.com/lfalex/spring-boot-example.git spring-boot-mybatis 例子使用 mysql5.1.46 版本; 环境:e ...

  7. DS博客作业01--线性表

    1.本周学习总结(0--2分) 1.1思维导图 1.2.谈谈你对线性表的认识及学习体会. 1.线性表的内容上了三星期的课,相对来说内容比较丰富,尤其是链表方面,包含单链表,双链表和循环链表.作为第一部 ...

  8. 邮件服务器安装--Postfix + Dovecot + Squirrelmail--CentOS 6.4

    英文原文链接 : http://www.unixmen.com/install-postfix-mail-server-with-dovecot-and-squirrelmail-on-centos- ...

  9. NoSuchMethodError 问题

    最近maven升级到gradle后,总是报NoSuchMethod error.然后 ,报错的类确实是有这个方法,一切看起来都没有问题.那么运行时jvm到底加载的哪里的类呢?有没有相关的命令可以查询, ...

  10. Django ORM中datetiem数据类型字段无法对比处理办法

    在做商城项目中浏览足迹时,我利用浏览商品的ID和浏览的时间保存到browse表中,然后在我的足迹页面根据最近日期进行展示 条件:每天/个商品只能如一次表 后台代码如下: #存储浏览足迹到browse表 ...