在看了作者的介绍,然后我又到mvnrepository上去看了各个库的的使用数之后,发现只能在jackson和gson之间做选择。
以下是原文
有效选择七个关于Java的JSON开源类库
April 4, 2014 By Constantin Marian Alin
翻译:无若
(英语原文:http://www.developer.com/lang/jscript/top-7-open-source-json-binding-providers-available-today.html)
简介
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仓库,给出地址:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
public
class
JsonThirdObject {
private
int
age =
81
;
private
String name =
"Michael Caine"
;
private
List<String> messages;
public
JsonThirdObject() {
this
.messages =
new
ArrayList<String>() {
{
add(
"You wouldn't hit a man with no trousers.."
);
add(
"At this point, I'd set you up with a.."
);
add(
"You know, your bobby dangler, giggle stick,.."
);
}
};
}
// Getter and setter
}
public
class
JsonSecondObject {
private
int
age =
83
;
private
String name =
"Clint Eastwood"
;
private
JsonThirdObject jsnTO =
new
JsonThirdObject();
private
List<String> messages;
public
JsonSecondObject() {
this
.messages =
new
ArrayList<String>() {
{
add(
"This is the AK-47 assault.."
);
add(
"Are you feeling lucky.."
);
add(
"When a naked man's chasing a.."
);
}
};
}
// Getter and setter
}
public
class
JsonFirstObject {
private
int
age =
76
;
private
String name =
"Morgan Freeman"
;
private
JsonSecondObject jsnSO =
new
JsonSecondObject();
private
List<String> messages;
public
JsonFirstObject() {
this
.messages =
new
ArrayList<String>() {
{
add(
"I once heard a wise man say.."
);
add(
"Well, what is it today? More.."
);
add(
"Bruce... I'm God. Circumstances have.."
);
}
};
}
// Getter and setter
}
public
class
Json {
private
int
age =
52
;
private
String name =
"Jim Carrey"
;
private
JsonFirstObject jsnFO =
new
JsonFirstObject();
private
List<String> messages;
public
Json() {
this
.messages =
new
ArrayList<String>() {
{
add(
"Hey, maybe I will give you.."
);
add(
"Excuse me, I'd like to.."
);
add(
"Brain freeze. Alrighty Then I just.."
);
}
};
}
// Getter and setter
}
|
上面的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
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
64
65
66
67
68
69
70
71
|
{
"age"
:52,
"name"
:
"Jim Carrey"
,
"jsnFO"
:{
"age"
:76,
"name"
:
"Morgan Freeman"
,
"jsnSO"
:{
"age"
:83,
"name"
:
"Clint Eastwood"
,
"jsnTO"
:{
"age"
:81,
"name"
:
"Michael Caine"
,
"messages"
:[
"You wouldn't hit a man.."
,
"At this point, I'd set you.."
,
"You know, your bobby dangler.."
]
},
"messages"
:[
"This is the AK-47 assault.."
,
"Are you feeling lucky.."
,
"When a naked man's chasing a.."
]
},
"messages"
:[
"I once heard a wise man.."
,
"Well, what is it today? More.."
,
"Bruce... I'm God. Circumstances have.."
]
},
"messages"
:[
"Hey, maybe I will give you a call.."
,
"Excuse me, I'd like to ask you a few.."
,
"Brain freeze. Alrighty Then I just heard.."
]
}
|
现在,让我们来看看怎么样把Java对象转换成JSON并且写入文件。Jackson使用一个ObjectMapper功能,我们第一步要做的是:
1
2
3
|
Json jsonObj =
new
Json();
ObjectMapper mapper =
new
ObjectMapper();
|
然后,我们将会使用这个ObjectMapper直接写入值到文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
System.out.println(
"Convert Java object to JSON format and save to file"
);
try
{
mapper.writeValue(
new
File(
"c:\\jackson.json"
), jsonObj);
}
catch
(JsonGenerationException e) {
}
catch
(JsonMappingException e) {
}
catch
(IOException e) {
}
|
现在,我们有了一个JSON文件,但是,怎么样转回Java对象呢?我们可以这样做:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
System.out.println(
"Read JSON from file, convert JSON back to object"
);
try
{
jsonObj = mapper.readValue(
new
File(
"c:\\jackson.json"
), Json.
class
);
}
catch
(JsonGenerationException e) {
}
catch
(JsonMappingException e) {
}
catch
(IOException e) {
}
|
从上面的例子我们知道了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
9
10
11
12
13
14
15
|
Json jsonObj =
new
Json();
Gson gson =
new
Gson();
System.out.println(
"Convert Java object to JSON format and save to file"
);
try
(FileWriter writer =
new
FileWriter(
"c:\\gson.json"
)) {
writer.write(gson.toJson(jsonObj));
}
catch
(IOException e) {
}
|
JSON转换成Java对象:
1
2
3
4
5
6
7
8
9
10
11
|
System.out.println(
"Read JSON from file, convert JSON string back to object"
);
try
(BufferedReader reader =
new
BufferedReader(
new
FileReader(
"c:\\gson.json"
))) {
jsonObj = gson.fromJson(reader, Json.
class
);
}
catch
(FileNotFoundException e) {
}
catch
(IOException e) {
}
|
上面就是我们所有需要做的,接下来我们可以对 jsonObj 作进一步处理。当调用JSON操作的时候,因为Gson的实例化对象没有维持任何状态,我们可以重复使用一个对象为多个JSON序列化和反序列化操作。