有效选择七个关于Java的JSON开源类库
April 4, 2014 By Constantin Marian Alin
翻译:无若
简介
JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换形式,是一种XML的替代方案,而且比XML更小,更快而且更易于解析。因为JSON描述对象的时候使用的是JavaScript语法,它是语言和平台独立的,并且这些年许多JSON的解析器和类库被开发出来。在这篇文章中,我们将会展示7种Java JSON类库。基本上,我们将会试着把Java对象转换JSON格式并且存储到文件,并且反向操作,读JSON文件转换成一个对象。为了让文章更有意义,我们将会测量每一种JSON类库在不同情况下的处理速度。
(一)类库介绍及其使用
(1)使用Jackson类库
第一个介绍的是Jackson类库,Jackson库是一个“旨在为开发者提供更快,更正确,更轻量级,更符合人性思维” 的类库。Jackson为处理JSON格式提供了三种模型的处理方法。
1、流式API或者增量解析/产生( incremental parsing/generation):读写JSON内容被作为离散的事件。
2、树模型:提供一个可变内存树表示JSON文档。
3、数据绑定(Data binding):实现JSON与POJO(简单的Java对象(Plain Old Java Object))的转换
我们感兴趣的是Java对象与JSON的转换,因此,我们将集中于第三种处理方法。首先我们需要下载Jackson。Jackson的核心功能使用三个类库,分别是jackson-core-2.3.1, jackson-databind-2.3.1和jackson-annotations-2.3.1; 三个类库的下载都来自于Maven仓库,给出地址:
现在,让我们来工作吧,为了从Java对象中获得一个一个复杂的JSON对象,我们将会使用下面的类去构造一个对象。同样的Java对象将会被用于这篇文章的所有的类库中。
上面的Java对象转换成JSON格式是下面这样的。
现在,让我们来看看怎么样把Java对象转换成JSON并且写入文件。Jackson使用一个ObjectMapper功能,我们第一步要做的是:
然后,我们将会使用这个ObjectMapper直接写入值到文件。
现在,我们有了一个JSON文件,但是,怎么样转回Java对象呢?我们可以这样做:
从上面的例子我们知道了JSON和Java对象的相互转换,在try-catch中总共也就两行,看起来不错是吧,但是它快么?我们将会在后面的文章中揭晓。
(2)使用 Google-Gson类库
1)提供简单的toJson()方法和fromJson()去实现相互转换。
2)可以从JSON中转换出之前存在的不可改变的对象。
3)扩展提供了Java泛型。
4)支持任意复杂的对象。
JSON转换成Java对象:
上面就是我们所有需要做的,接下来我们可以对 jsonObj 作进一步处理。当调用JSON操作的时候,因为Gson的实例化对象没有维持任何状态,我们可以重复使用一个对象为多个JSON序列化和反序列化操作。
(3)使用JSON-lib类库
同样,让我们来把Java对象转成JSON。
JSON转Java对象
(4)使用Flexjson类库
JSON转Java对象
简单有效是吧!
(5)使用Json-io类库
它不需要其他依赖。
例子:Java对象转JSON
JSON转Java对象
(6)使用Genson类库
例子:Java对象转JSON
JSON转Java对象
(7)使用JSONiJ类库
它不需要任何依赖。
例子:Java对象转JSON
JSON转Java 对象
看起来JSONiJ需要的代码多些,性能怎么样,我们看下面。
(二)基准测试
现在我们要来看看性能了,测试硬件配置:Intel Core i5 laptop with 2.50GHz 单通道DDR3 RAM 4G,软件配置:Windows 7 Ultimate 64-bit SP1
基准测试运行一样的虚拟机(JVM),在测试之前,每一个类库都有一个热身,去限制内存使用的造成的影响,用一个显式调用垃圾收集器。下面的图表代表的是序列化和反序列化JSON数据以毫秒级使用50次迭代和10次热身(warm-up)迭代的平均的时间。
(译者注:红色为序列化(Java对象转JSON),蓝色为反序列化(JSON转Java对象))
上面的图表显示,Flexjson序列化小数据时是最快的,而JSON-lib是最慢的。反序列化的时候,Gson最快,JSON-lib还是最慢的。
下面的图表代表的是我们的数据在287kb时,序列化和反序列化所花费的平均时间。
这张图显示,我们对少量的数据操作时,最快的是Gson ,之后的是 Genson和Flexjson。
当变成大数据时,结果变得很不一样。在下面的图表中,使用的是108Mb的数据,在序列化的时候,Jackson变成了最快的,Flexjson变成第二快。在反序列化的时候,JSON-lib变成了最快的,之前在处理小数据时,它是最慢的,第二快的是Jackson。
下面的图表,显示的是处理更大一点的数据时,我们应该使用Jackson和JSON-lib。
另外一个重要的测试是关于.jar包的大小。这对于移动端的开发很重要,我们从下图中看到,json-io最小,之后依次是Flexjson和JSONiJ:
(三)结论
在这篇文章中,我们知道了七种方式来实现Java对象和JSON之间的互相转换。以及哪一个类库更快,哪一个更慢,在什么情况下使用等。作为结论,如果你在你的应用中是想使用小一点的数据量,你应该使用Flexjson或者Gson,如果你需要大的数据量你应该考虑Jackson 和JSON-lib。