pom.xml文件中加入依赖依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency>
首先建立两个实体类,Student.Java 和 Teacher.java
Student.java 和Teacher.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
|
public
class
Student {
private
int
id;
private
String name;
private
int
age;
/**
* 默认的构造方法必须不能省,不然不能解析
*/
public
Student(){
}
public
Student(
int
id,String name,
int
age) {
this
.id = id;
this
.name = name;
this
.age = age;
}
public
int
getId() {
return
id;
}
public
void
setId(
int
id) {
this
.id = id;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
}
@Override
public
String toString() {
return
"Student [id="
+ id +
", name="
+ name +
", age="
+ age +
"]"
;
}
}
|
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
|
import
java.util.List;
public
class
Teacher {
private
int
id;
private
String name;
private
List<Student> students;
/**
* 默认的构造方法必须不能省,不然不能解析
*/
public
Teacher() {
}
public
Teacher(
int
id,String name) {
this
.id = id;
this
.name = name;
}
public
int
getId() {
return
id;
}
public
void
setId(
int
id) {
this
.id = id;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
List<Student> getStudents() {
return
students;
}
public
void
setStudents(List<Student> students) {
this
.students = students;
}
@Override
public
String toString() {
return
"Teacher [id="
+ id +
", name="
+ name +
", mStudents="
+ students +
"]"
;
}
}
|
上面 的代码比较简单,主要就几个属性,这里值得注意的是, 默认的构造函数一定要写,不然是无法解析的。(对于fastjson 严格按照JavaBean的规范来,有一点不对就无法解析,这里一定要切记,每一个实体类的属性的get , set 方法必须写,切方法第四个字母必须大写,最好使用Eclipse的source->genreal setters and getters 生成get,set 方法,切记,切记 )。对于Gson 这里就没有这么多的要求了,但最好还是按照JavaBean来写,避免一些位置的错误。
首先看 fastjson 的解析
首先解析一个实体类为json 格式。
1
2
|
Student student =
new
Student(
0
,
"Aaron"
,
24
);
System.out.println(JSON.toJSONString(student));
|
1
|
输出结果为:{
"age"
:
24
,
"id"
:
0
,
"name"
:
"Aaron"
}
|
输出的json格式与我们的Student中定义的属性其实是不一致的,这个其实不影响我们生成以及后面的解析,因为他有严格的get和set方法定义。
更复杂一点的数据类型也可以很方便的使用JSON.toJsonString(Object o) 这个方法进行解析成json格式。
1
2
3
4
5
|
List<Student> students =
new
ArrayList<Student>();
for
(
int
i=
0
;i<
5
;i++) {
Student stu =
new
Student(i,
"Student"
+ i,
18
+i);
students.add(stu);
}
|
解析结果为:
1
|
[{
"age"
:
18
,
"id"
:
0
,
"name"
:
"Student0"
},{
"age"
:
19
,
"id"
:
1
,
"name"
:
"Student1"
},{
"age"
:
20
,
"id"
:
2
,
"name"
:
"Student2"
},{
"age"
:
21
,
"id"
:
3
,
"name"
:
"Student3"
},{
"age"
:
22
,
"id"
:
4
,
"name"
:
"Student4"
}]
|
我们来看看更复杂一点的结构。 我们将一个Teacher 列表来解析,一个Teacher对象中是包含Student 列表的这个也在我们常用的数据模型,下面看看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
List<Teacher> teaList =
new
ArrayList<Teacher>();
long
time = System.currentTimeMillis();
for
(
int
i=
0
;i<
10
;i++) {
Teacher teacher =
new
Teacher(i,
"Teacher "
+ i);
List<Student> stus =
new
ArrayList<Student>();
for
(
int
j =
0
;j<
4
;j++) {
Student s =
new
Student(j,
"Student"
+ j,
18
+j);
stus.add(s);
}
teacher.setStudents(stus);
teaList.add(teacher);
}
String jsonTeach = JSON.toJSONString(teaList);
System.out.println(
"fastjson = "
+ jsonTeach);
|
结果为:
1
|
fastjson = [{
"id"
:
0
,
"name"
:
"Teacher 0"
,
"students"
:[{
"age"
:
18
,
"id"
:
0
,
"name"
:
"Student0"
},{
"age"
:
19
,
"id"
:
1
,
"name"
:
"Student1"
}]},{
"id"
:
1
,
"name"
:
"Teacher 1"
,
"students"
:[{
"age"
:
18
,
"id"
:
0
,
"name"
:
"Student0"
},{
"age"
:
19
,
"id"
:
1
,
"name"
:
"Student1"
}]},{
"id"
:
2
,
"name"
:
"Teacher 2"
,
"students"
:[{
"age"
:
18
,
"id"
:
0
,
"name"
:
"Student0"
},{
"age"
:
19
,
"id"
:
1
,
"name"
:
"Student1"
}]},{
"id"
:
3
,
"name"
:
"Teacher 3"
,
"students"
:[{
"age"
:
18
,
"id"
:
0
,
"name"
:
"Student0"
},{
"age"
:
19
,
"id"
:
1
,
"name"
:
"Student1"
}]}]
|
还是一个简单的函数而已,就能办到。
这个还有toJSONString 重载的方法,有很多,在给一个就是可以按照标准的json 格式输出,上面的输出都不规范,我们来看看。
1
2
3
4
5
6
7
8
|
Student student =
new
Student(
0
,
"Aaron"
,
24
);
System.out.println(JSON.toJSONString(student,
true
));
输出为:
{
"age"
:
24
,
"id"
:
0
,
"name"
:
"Aaron"
}
|
如果我们想要将实体类中的某个字段或某几个不进行解析呢?那么我们可以使用transient 关键字,来标记它为不需要的,在fastjson中还提供了一种便捷的方法来自定义我们需要序列化的字段,
1
|
SimplePropertyPreFilter filter =
new
SimplePropertyPreFilter(实体类.
class
,
"字段1"
,
"字段2"
); 字段为我们需要序列化的字段,如果实体类中没有改字段则不解析放弃该字段而不会报错。
|
如下:
1
2
|
SimplePropertyPreFilter filter =
new
SimplePropertyPreFilter(Student.
class
,
"id"
,
"age"
);
String jsonStu =JSON.toJSONString(students,filter);
|
下面进行fastjson 的反序列化,这个也是很常用的功能,
还是拿最简单的来进行示范,
1
2
3
|
Student student =
new
Student(
0
,
"Aaron"
,
24
);
String str = JSON.toJSONString(student,
true
);
System.out.println(JSON.parseObject(str,Student.
class
));
|
反序列化主要使用的是JSON.parseObject(str,class); 它就能把我们的str 转化为class 类型的对象,当然还有更复杂的对象,比如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
List<Student> students =
new
ArrayList<Student>();
for
(
int
i=
0
;i<
5
;i++) {
Student stu =
new
Student(i,
"Student"
+ i,
18
+i);
students.add(stu);
}
// 过滤哪些属性需要转换
// SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Student.class, "id","age");
// String jsonStu =JSON.toJSONString(students,filter);
String jsonStu =JSON.toJSONString(students);
System.out.println(jsonStu);
List<Student> stu =JSON.parseObject(jsonStu,
new
TypeReference<List<Student>>(){});
for
(
int
i=
0
;i<stu.size();i++)
{
System.out.println(stu.get(i));
}
|
前面就是添加数据,然后在后面解析为json格式,然后在转化为类的对象,这里转为List<Student> 对象,主要用到new TypeReference<数据返回类型> (){},我们使用的就是new TypeReference<List<Student>>(){} 返回的结果就是List<Student> 也不需要强制转化,我们看看上面输出的结果为:
1
2
3
4
5
|
Student [id=
0
, name=Student0, age=
18
]
Student [id=
1
, name=Student1, age=
19
]
Student [id=
2
, name=Student2, age=
20
]
Student [id=
3
, name=Student3, age=
21
]
Student [id=
4
, name=Student4, age=
22
]
|
附带,fastjson对时间的操作:
1
2
3
4
5
6
7
8
9
|
Date date =
new
Date();
// 输出毫秒值
System.out.println(JSON.toJSONString(date));
// 默认格式为yyyy-MM-dd HH:mm:ss
System.out.println(JSON.toJSONString(date,
SerializerFeature.WriteDateUseDateFormat));
// 根据自定义格式输出日期
System.out.println(JSON.toJSONStringWithDateFormat(date,
"yyyy-MM-dd"
,
SerializerFeature.WriteDateUseDateFormat));
|
输出结果:
1
2
3
|
1476085821568
"2016-10-10 15:50:21"
"2016-10-10"
|