简介
JSON是JavaScriptObjectNotation的缩写,是一种轻量级的数据交换形式,是一种XML的替代方案,而且比XML更小,更快而且更易于解析。因为JSON描述对象的时候使用的是JavaScript语法,它是语言和平台独立的,并且这些年许多JSON的解析器和类库被开发出来。在这篇文章中,我们将会展示7种JavaJSON类库。基本上,我们将会试着把Java对象转换JSON格式并且存储到文件,并且反向操作,读JSON文件转换成一个对象。为了让文章更有意义,我们将会测量每一种JSON类库在不同情况下的处理速度。
(一)类库介绍及其使用
(1)使用Jackson类库
第一个介绍的是Jackson类库,Jackson库是一个“旨在为开发者提供更快,更正确,更轻量级,更符合人性思维”的类库。Jackson为处理JSON格式提供了三种模型的处理方法。
1、流式API或者增量解析/产生(incrementalparsing/generation):读写JSON内容被作为离散的事件。
2、树模型:提供一个可变内存树表示JSON文档。
3、数据绑定(Databinding):实现JSON与POJO(简单的Java对象(PlainOldJavaObject))的转换
我们感兴趣的是Java对象与JSON的转换,因此,我们将集中于第三种处理方法。首先我们需要下载Jackson。Jackson的核心功能使用三个类库,分别是jackson-core-2.3.1,jackson-databind-2.3.1和jackson-annotations-2.3.1;三个类库的下载都来自于Maven仓库,给出地址:
(译者注:在中,正好是三个类库的文件夹)
现在,让我们来工作吧,为了从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
publicclassJsonThirdObject{
privateintage=81;
privateStringname="MichaelCaine";
privateList<String>messages;
publicJsonThirdObject(){
this.messages=newArrayList<String>(){
{
add("Youwouldn'thitamanwithnotrousers..");
add("Atthispoint,I'dsetyouupwitha..");
add("Youknow,yourbobbydangler,gigglestick,..");
}
};
}
//Getterandsetter
}
publicclassJsonSecondObject{
privateintage=83;
privateStringname="ClintEastwood";
privateJsonThirdObjectjsnTO=newJsonThirdObject();
privateList<String>messages;
publicJsonSecondObject(){
this.messages=newArrayList<String>(){
{
add("ThisistheAK-47assault..");
add("Areyoufeelinglucky..");
add("Whenanakedman'schasinga..");
}
};
}
//Getterandsetter
}
publicclassJsonFirstObject{
privateintage=76;
privateStringname="MorganFreeman";
privateJsonSecondObjectjsnSO=newJsonSecondObject();
privateList<String>messages;
publicJsonFirstObject(){
this.messages=newArrayList<String>(){
{
add("Ionceheardawisemansay..");
add("Well,whatisittoday?More..");
add("Bruce...I'mGod.Circumstanceshave..");
}
};
}
//Getterandsetter
}
publicclassJson{
privateintage=52;
privateStringname="JimCarrey";
privateJsonFirstObjectjsnFO=newJsonFirstObject();
privateList<String>messages;
publicJson(){
this.messages=newArrayList<String>(){
{
add("Hey,maybeIwillgiveyou..");
add("Excuseme,I'dliketo..");
add("Brainfreeze.AlrightyThenIjust..");
}
};
}
//Getterandsetter
}
上面的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
{
"age":52,
"name":"JimCarrey",
"jsnFO":{
"age":76,
"name":"MorganFreeman",
"jsnSO":{
"age":83,
"name":"ClintEastwood",
"jsnTO":{
"age":81,
"name":"MichaelCaine",
"messages":[
"Youwouldn'thitaman..",
"Atthispoint,I'dsetyou..",
"Youknow,yourbobbydangler.."
]
},
"messages":[
"ThisistheAK-47assault..",
"Areyoufeelinglucky..",
"Whenanakedman'schasinga.."
]
},
"messages":[
"Ionceheardawiseman..",
"Well,whatisittoday?More..",
"Bruce...I'mGod.Circumstanceshave.."
]
},
"messages":[
"Hey,maybeIwillgiveyouacall..",
"Excuseme,I'dliketoaskyouafew..",
"Brainfreeze.AlrightyThenIjustheard.."
]
}
现在,让我们来看看怎么样把Java对象转换成JSON并且写入文件。Jackson使用一个ObjectMapper功能,我们第一步要做的是:
1
2
3
JsonjsonObj=newJson();
ObjectMappermapper=newObjectMapper();
然后,我们将会使用这个ObjectMapper直接写入值到文件。
1
2
3
4
5
6
7
System.out.println("ConvertJavaobjecttoJSONformatandsavetofile");
try{
mapper.writeValue(newFile("c:jackson.json"),jsonObj);
}catch(JsonGenerationExceptione){
}catch(JsonMappingExceptione){
}catch(IOExceptione){
}
现在,我们有了一个JSON文件,但是,怎么样转回Java对象呢?我们可以这样做:
1
2
3
4
5
6
7
8
System.out.println("ReadJSONfromfile,convertJSONbacktoobject");
try{
jsonObj=mapper.readValue(newFile("c:jackson.json"),Json.class);
}catch(JsonGenerationExceptione){
}catch(JsonMappingExceptione){
}catch(IOExceptione){
}
从上面的例子我们知道了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,可以通过下载。下面是例子,把Java对象转换成JSON。
1
2
3
4
5
6
7
8
JsonjsonObj=newJson();
Gsongson=newGson();
System.out.println("ConvertJavaobjecttoJSONformatandsavetofile");
try(FileWriterwriter=newFileWriter("c:gson.json")){
writer.write(gson.toJson(jsonObj));
}catch(IOExceptione){
}
JSON转换成Java对象:
1
2
3
4
5
6
System.out.println("ReadJSONfromfile,convertJSONstringbacktoobject");
try(BufferedReaderreader=newBufferedReader(newFileReader("c:gson.json"))){
jsonObj=gson.fromJson(reader,Json.class);
}catch(FileNotFoundExceptione){
}catch(IOExceptione){
}
上面就是我们所有需要做的,接下来我们可以对jsonObj作进一步处理。当调用JSON操作的时候,因为Gson的实例化对象没有维持任何状态,我们可以重复使用一个对象为多个JSON序列化和反序列化操作。
(3)使用JSON-lib类库
JSON-lib类库是基于DouglasCrockford的工作成果,能转换bean,map,集合(collection),java数组和XML转换成JSON并能反向转换成beans和动态bean(DynaBean)。JSON-lib类库的下载地址:下面这些是依赖文件
·jakartacommons-lang2.6
·jakartacommons-beanutils1.9.1
·jakartacommons-collections3.2.1
·jakartacommons-logging1.1.3
·ezmorph1.0.6