Fastjson 详解

目前常用的数据传输格式主要有: xml 与 json,无论使用xml还是json 传输格式,在实际应用中,都需要将其与对象互相转换,也有很多相应的转换库,比如:xml 有dom4j, json有 jackson,Fastjson 今天为大家讲解的是Fastjson。

1.1 Fastjson 起源

fastjson 是一个Java语言编写的高性能功能完善的JSON库,是alibaba的开源项目,并且是目前Java语言中的最快的JSON库,接口简单易用等特点

1.2 Fastjson使用方法

这里通过简单的案例来进行讲解:
这里使用两个bean,School,Student 由于篇幅原因,省去set()以及get()方法。

1
2
3
4
5
6
7
public class School {

private String id;
private String name;
private List<Student> list;
.....
}

1
2
3
4
5
6
7
public class Student {
private String id;
private String name;
private int age;
private Date time;
.....
}

1.2.1 bean转换为json

1
2
3
4
5
6
7
8
9
10
@Test
public void testBeanToJson(){
Student user = new Student();
user.setAge(11);
user.setId("11");
user.setName("名字");
user.setTime(new Date());
String jsonData = JSONObject.toJSONString(user);
System.out.println(jsonData);
}

其中 JSONObject.toJSONString(object); object的参数可以为: 对象,泛型集合等
返回结果:

1
{"age":11,"id":"11","name":"名字","time":1462514489964}

1.2.2 bean转换为json(指定日期格式)

1
2
3
4
5
6
7
8
9
10
@Test
public void testBeanDateToJson(){
Student user = new Student();
user.setAge(11);
user.setId("11");
user.setName("名字");
user.setTime(new Date());
String jsonData = JSONObject.toJSONStringWithDateFormat(user, "yyyy-MM-DD HH:mm:ss", SerializerFeature.NotWriteRootClassName);
System.out.println(jsonData);
}

其中 JSONObject.toJSONStringWithDateFormat(object,format,SerializerFeature… features);其中:
object 表示待转换的对象。
format: 表示待转换参数的格式。 如: yyyy-MM-DD HH:mm:ss
features: 表示输出的json数据的格式,如:
① SerializerFeature.NotWriteRootClassName
② SerializerFeature.PrettyFormat等等。
返回结果:

1
{"age":11,"id":"11","name":"名字","time":"2016-05-127 13:53:56"}

如果features: 参数值是SerializerFeature.PrettyFormat,返回结果是:

1
2
3
4
5
6
{
"age":11,
"id":"11",
"name":"名字",
"time":"2016-05-127 13:54:34"
}

1.2.3: 对象中包含对象的转换为json数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void testShcoolToJson(){
School school = new School();
school.setId("id");
school.setName("school");

List<Student> list = new ArrayList<Student>();
Student student1 = new Student();
student1.setAge(11);
student1.setId("11");
student1.setName("name1");

Student student2 = new Student();
student2.setAge(11);
student2.setId("id1");
student2.setName("Name2");

list.add(student1);
list.add(student2);
school.setList(list);
String jsonData = JSONObject.toJSONString(school);
System.out.println(jsonData);
}

结果为:

1
{"id":"id","list":[{"age":11,"id":"11","name":"name1"},{"age":11,"id":"id1","name":"Name2"}],"name":"school"}

1.2.4: 对象json格式字符串转换为bean对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void testjsonToObject(){
String data = getData(); //这里是json数据、
Student student = JSONObject.parseObject(data,Student.class);
System.out.println(student.toString());
}

/**
* 返回数据
* @return
*/
private String getData(){
Student user = new Student();
user.setAge(11);
user.setId("11");
user.setName("名字");
user.setTime(new Date());
String jsonData = JSONObject.toJSONString(user);
System.out.println(jsonData);
return jsonData;
}

JSONObject.parseObject(String text, Class clazz);
其中 text 表示待转换为对象的json数据。
clazz 表示转换成的对象。
这里需要注意的是: 对象中的属性需与json格式的字符串中的键是一致的,类型也需是一致的。

1.2.5: 集合json格式数据转换为 集合对象

使用的方法是: JSONObject.parseArray(String arg0, Class arg1);
其中 arg0 是 集合型的json格式字符串,
如:

1
[{"age":11,"id":"11","name":"name1"},{"age":11,"id":"id1","name":"Name2"}]

arg1 对象集合中的对象,如果对象集合为 List,此时的参数应该为: Student.class

1.3 Fastjson的封装工具类

Fastjson给我们提供了非常方便,简单易用的API,根据设计模式中的单一原则以及实际应用中的需要,在实际应用当中,我们应该再封装一层,我简单的封装了下面这个工具类,如下:

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
/**
* 转换json工具类
* @author Andy
*
*/
public class ConvertJsonUtils {

/**
* 将java对象转换为json格式的字符串
* @param object 带转换的对象
* @return json格式的字符串
*/
public static String toJsonString(Object object){
return JSONObject.toJSONString(object);
}

/**
* 默认日期
* @param object
* @return
*/
public static String toJsonWithDefaultDateFormatString(Object object){
return toJsonWithDateString(object,"yyyy-MM-DD hh:mm:ss");
}

/**
* 带有日期格式的json格式字符串转换
* @param object
* @param format
* @return
*/
public static String toJsonWithDateString(Object object,String format){
return JSONObject.toJSONStringWithDateFormat(object,format, SerializerFeature.PrettyFormat);
}

/**
* 将对象转换为json格式字符串(包括子类的,与toJsonString具体区别可以参考自定义菜单)
* @param object
* @return
*/
public static String toJSONAndChildStr(Object object){
return JSONObject.toJSON(object).toString();
}

/**
* 将json格式的数据转换为java对象(不包括数组,集合类型)
* @param <T>
* @param jsonData json格式的字符串
* @param t 待转换成的java对象
* @return
*/
public static <T> T jsonToJavaObject(String jsonData,Class<T> t){
return JSONObject.parseObject(jsonData, t);
}

/**
* 将json格式的数据转换为java集合对象 ,List集合,map集合
* @param jsonData 待转换的json格式的字符串
* @param t 泛型集合对象
* @return
*/
public static <T> List<T> jsonToJavaList(String jsonData,Class<T> t){
return JSONObject.parseArray(jsonData, t);
}

/**
* 获取json格式数据中的键,将其中的值作为转换为List中的数据
* @param jsonData json格式的数据
* @param t 待转换的类型
* @param key json格式中的指定的键
* @return list集合
* 示列:
*
*/
public static <T> List<T> jsonToJavaListByKey(String jsonData,Class<T> t,String key){
List<T> result = new ArrayList<T>();
JSONObject obj = JSONObject.parseObject(jsonData);
if(null!=obj){
if(obj.containsKey(key)){
jsonData = obj.getString(key);
result = new ArrayList<T>();
result = JSONObject.parseArray(jsonData,t);
}
}
return result;
}
}

1.4 Fastjson 在 Android 中的使用

在Android 开发中使用Fastjson,不能直接将 fastjson jar包直接添加到Android项目中,可以通过以下方法进行添加:

1.4.1: 通过 Gradle:

1
compile 'com.alibaba:fastjson:VERSION_CODE'

其中 VERSION_CODE 可以通过 这里 或者这里 获取最新的版本。
例如:

1
compile 'com.alibaba:fastjson:1.1.46.android'

(个人建议使用的方法,也是现在使用Android Studio主流方法)

1.4.2: 通过jar:

通过 这里 下载对应的jar版本,添加到项目中即可。
(个人不建议使用这种方法)

1.5 本文参考链接:

Fastjson 官方文档

1.6 小结

以上就是本人在实际项目中对Fastjson 使用的一些小结。在实际应用中,也可灵活的根据自己的需求进行封装。