简介java
JSON是JavaScriptObjectNotation的缩写,是一种轻量级的数据交换形式,是一种XML的替代方案,并且比XML更小,更快并且更易于解析。由于JSON描述对象的时候使用的是JavaScript语法,它是语言和平台独立的,而且这些年许多JSON的解析器和类库被开发出来。在这篇文章中,咱们将会展现7种JavaJSON类库。基本上,咱们将会试着把Java对象转换JSON格式而且存储到文件,而且反向操做,读JSON文件转换成一个对象。为了让文章更有意义,咱们将会测量每一种JSON类库在不一样状况下的处理速度。apache
(一)类库介绍及其使用json
(1)使用Jackson类库数组
第一个介绍的是Jackson类库,Jackson库是一个“旨在为开发者提供更快,更正确,更轻量级,更符合人性思惟”的类库。Jackson为处理JSON格式提供了三种模型的处理方法。架构
一、流式API或者增量解析/产生(incrementalparsing/generation):读写JSON内容被做为离散的事件。app
二、树模型:提供一个可变内存树表示JSON文档。maven
三、数据绑定(Databinding):实现JSON与POJO(简单的Java对象(PlainOldJavaObject))的转换ide
咱们感兴趣的是Java对象与JSON的转换,所以,咱们将集中于第三种处理方法。首先咱们须要下载Jackson。Jackson的核心功能使用三个类库,分别是jackson-core-2.3.1,jackson-databind-2.3.1和jackson-annotations-2.3.1;三个类库的下载都来自于Maven仓库,给出地址:性能
http://repo1.maven.org/maven2/com/fasterxml/jackson/测试
(译者注:在http://repo1.maven.org/maven2/com/fasterxml/jackson/core/中,正好是三个类库的文件夹)
如今,让咱们来工做吧,为了从Java对象中得到一个一个复杂的JSON对象,咱们将会使用下面的类去构造一个对象。一样的Java对象将会被用于这篇文章的全部的类库中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
|
上面的Java对象转换成JSON格式是下面这样的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
|
如今,让咱们来看看怎么样把Java对象转换成JSON而且写入文件。Jackson使用一个ObjectMapper功能,咱们第一步要作的是:
1 2 3 |
|
而后,咱们将会使用这个ObjectMapper直接写入值到文件。
1 2 3 4 5 6 7
|
|
如今,咱们有了一个JSON文件,可是,怎么样转回Java对象呢?咱们能够这样作:
1 2 3 4 5 6 7 8 |
|
从上面的例子咱们知道了JSON和Java对象的相互转换,在try-catch中总共也就两行,看起来不错是吧,可是它快么?咱们将会在后面的文章中揭晓。
(2)使用Google-Gson类库
第二种就是Google-Gson,咱们当即开始讨论Gson,你或许更喜欢他的全名Google-Gson。Gson能实现Java对象和JSON之间的相互转换。甚至都不须要注释。Gson的特色:
1)提供简单的toJson()方法和fromJson()去实现相互转换。
2)能够从JSON中转换出以前存在的不可改变的对象。
3)扩展提供了Java泛型。
4)支持任意复杂的对象。
Gson就须要一个.jar文件,gson-2.2.4.jar,能够经过http://code.google.com/p/google-gson/downloads/list下载。下面是例子,把Java对象转换成JSON。
1 2 3 4 5 6 7 8 |
|
JSON转换成Java对象:
1 2 3 4 5 6
|
|
上面就是咱们全部须要作的,接下来咱们能够对jsonObj做进一步处理。当调用JSON操做的时候,由于Gson的实例化对象没有维持任何状态,咱们能够重复使用一个对象为多个JSON序列化和反序列化操做。
(3)使用JSON-lib类库
JSON-lib类库是基于DouglasCrockford的工做成果,能转换bean,map,集合(collection),java数组和XML转换成JSON并能反向转换成beans和动态bean(DynaBean)。JSON-lib类库的下载地址:http://sourceforge.net/projects/json-lib/files/下面这些是依赖文件
·jakartacommons-beanutils1.9.1
·jakartacommons-collections3.2.1
(译者注:DouglasCrockford是Web开发领域最知名的技术权威之一,ECMAJavaScript2.0标准化委员会委员。被JavaScript之父BrendanEich称为JavaScript的大宗师(Yoda)。曾任Yahoo!资深JavaScript架构师,现任PayPal高级JavaScript架构师。他是JSON、JSLint、JSMin和ADSafe的创造者,也是名著《JavaScript:TheGoodParts》(中文版《JavaScript语言精粹》)的做者。撰写了许多广为流传、影响深远的技术文章,包括“JavaScript:世界上最被误解的语言”。DouglasCrockford曾在著名的Lucasfilm电影公司任技术总监;在Paramount(派拉蒙)公司任新媒体高级总监;communities社区创始人兼CEO;State软件公司CTO。2012.05.14,Paypal宣布DouglasCrockford加入Paypal。)
一样,让咱们来把Java对象转成JSON。
1 2 3 4 5 6 7 8
|
|
JSON转Java对象
1 2 3 4 5
|
|
这里有个问题,这些依赖关系会影响到性能吗?文章在下面揭晓。
(4)使用Flexjson类库
Flexjson是一个轻量级的库,能序列化和反序列化Java对象和JSON,容许深层和浅层对象的拷贝。深度拷贝意味着一个被Flexjson序列化的对象,它能让对象作到相似于延迟加载(lazy-loading)的技术,能让咱们在对对象有须要时才提取。当咱们想把整个对象写入到文件时,这不是一个好的状况,可是它知道须要才去作时,这是很好的。
Flexjson下载地址:http://sourceforge.net/projects/flexjson/files/它不须要其余库就能够工做。下面是例子:Java对象转JSON。
1 2 3 4 5 6 7
|
|
JSON转Java对象
1 2 3 4 5 6
|
|
简单有效是吧!
(5)使用Json-io类库
json-io有两个主要的类,一个读和一个写,排除了使用ObjectInputStream和ObjectOutputStream两个类去读写。Json-io能序列化任意的Java对象图(graph)转变成JSON,而且能记忆完整的语义图(graphsemantics)和对象类型。下载地址:MavenCentralRepository
它不须要其余依赖。
例子:Java对象转JSON
1 2 3 4 5 6
|
|
JSON转Java对象
1 2 3 4 5 6
|
|
它的文档上说,Json-io比JDK的ObjectInputStream和ObjectOutputStream的序列化操做要快,咱们将会在后面的文章中说明。
(6)使用Genson类库
Genson是一个可扩展的,可伸缩的,易于使用的开源库。除此以外,Genson完整支持了泛型,支持JSON在JAX-RS的实现,支持JAXB的注释(annotation)和类型(types),而且容许序列化和反序列化拥有复杂关键字的map。
下载地址:http://code.google.com/p/genson/downloads/list,它没有任何依赖。
例子:Java对象转JSON
1 2 3 4 5 6 7
|
|
JSON转Java对象
1 2 3 4 5 6
|
|
(7)使用JSONiJ类库
最后一个讨论的是JSONiJ。JSONiJ是JSON的解析器,一个JPath和Marshaller的实现,能实现Java对象和JSON的相互转换。下载地址:https://bitbucket.org/jmarsden/jsonij/downloads
它不须要任何依赖。
例子:Java对象转JSON
1 2 3 4 5 6
|
|
JSON转Java对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
|
看起来JSONiJ须要的代码多些,性能怎么样,咱们看下面。
(二)基准测试
如今咱们要来看看性能了,测试硬件配置:IntelCorei5laptopwith2.50GHz单通道DDR3RAM4G,软件配置:Windows7Ultimate64-bitSP1
基准测试运行同样的虚拟机(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。