各Json序列化反序列化工具比较

各Json序列化与反序列化工具比较

本文主要比较Java中fastjsonjacksongson三个包的序列化与反序列化性能,可拓展性,易用性等。

开发环境:

jdk: java version “1.8.0_161”

os: windows10

cpu: Intel i5-10400 @2.90GHz

内存: 16GB

测试代码

fastjson

点击查看代码
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
public class FastJsonUtil {

/**
* 序列化为字符串
*
* @param object
* @return java.lang.String
* @author zhuweitung
* @date 2021/4/29
*/
public static String serialize(Object object) {
if (object == null) {
return null;
}
return JSON.toJSONString(object);
}

/**
* 反序列化为对象
*
* @param json
* @param clazz
* @return T
* @author zhuweitung
* @date 2021/4/29
*/
public static <T> T deserializeObj(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return null;
}
return JSON.parseObject(json, clazz);
}

/**
* 反序列化为集合
*
* @param json
* @param clazz
* @return java.util.List<T>
* @author zhuweitung
* @date 2021/4/29
*/
public static <T> List<T> deserializeArray(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return new ArrayList<T>();
}
return JSON.parseArray(json, clazz);
}

}

jackson

点击查看代码
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
public class JacksonUtil {

private static final ObjectMapper mapper = new ObjectMapper();

/**
* 序列化为字符串
*
* @param object
* @return java.lang.String
* @author zhuweitung
* @date 2021/4/29
*/
public static String serialize(Object object) {
if (object == null) {
return null;
}
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}

/**
* 反序列化为对象
*
* @param json
* @param clazz
* @return T
* @author zhuweitung
* @date 2021/4/29
*/
public static <T> T deserializeObj(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return null;
}
try {
return mapper.readValue(json, clazz);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}

/**
* 反序列化为集合
*
* @param json
* @param clazz
* @return java.util.List<T>
* @author zhuweitung
* @date 2021/4/29
*/
public static <T> List<T> deserializeArray(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return new ArrayList<T>();
}
try {
CollectionType collectionType = mapper.getTypeFactory()
.constructCollectionType(List.class, clazz);
return mapper.readValue(json, collectionType);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return new ArrayList<T>();
}

}

gson

点击查看代码
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
public class GsonUtil {

private static final Gson gson = new Gson();

/**
* 序列化为字符串
*
* @param object
* @return java.lang.String
* @author zhuweitung
* @date 2021/4/29
*/
public static String serialize(Object object) {
if (object == null) {
return null;
}
return gson.toJson(object);
}

/**
* 反序列化为对象
*
* @param json
* @param clazz
* @return T
* @author zhuweitung
* @date 2021/4/29
*/
public static <T> T deserializeObj(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return null;
}
return gson.fromJson(json, clazz);
}

/**
* 反序列化为集合
*
* @param json
* @param clazz
* @return java.util.List<T>
* @author zhuweitung
* @date 2021/4/29
*/
public static <T> List<T> deserializeArray(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return new ArrayList<T>();
}
Type collectType = TypeToken.getParameterized(ArrayList.class, clazz).getType();
return gson.fromJson(json, collectType);
}
}

序列化与反序列化性能比较

1万数据

10万数据

100万数据

日期序列化

fastjson

加上@JSONField注解,设定日期序列化格式

1
2
@JSONField(format = "yyyy年M月d日H时m分s秒")
private Date date;

Jackson

加上@JsonFormat注解,设定日期序列化格式,timezone属性设置时区(默认太平洋时间),可以通过配置设置全局时区

1
2
@JsonFormat(pattern = "yyyy年M月d日H时m分s秒", timezone="GMT+8")
private Date date;

gson

加上@JsonAdapter注解,DateAdapter为自己写的日期转换适配器

1
2
@JsonAdapter(DateAdapter.class)
private Date date;

DateAdapter代码如下:

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
public class DateAdapter extends TypeAdapter<Date> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日H时m分s秒");

@Override
public void write(JsonWriter jsonWriter, Date date) throws IOException {
jsonWriter.value(sdf.format(date));
}

@Override
public Date read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
} else {
Date date = this.deserializeToDate(in.nextString());
return date;
}
}

private Date deserializeToDate(String s) {
synchronized (sdf) {
try {
return sdf.parse(s);
} catch (ParseException ignored) {
}
try {
return sdf.parse(s);
} catch (ParseException ignored) {
}
try {
return ISO8601Utils.parse(s, new ParsePosition(0));
} catch (ParseException e) {
throw new JsonSyntaxException(s, e);
}
}
}
}

SpringMVC消息转换器

fastjson

FastJsonHttpMessageConverter加入HttpMessageConverter的转换器中

实现SerializeFilterAfterFilter等接口,再将实现类加入转换参数中

jackson

MappingJackson2HttpMessageConverter加入HttpMessageConverter的转换器中

jackson自定义序列化提供JsonSerializerStdSerializer两个抽象类

gson

GsonHttpMessageConverter加入HttpMessageConverter的转换器中

不满足序列化要求时,需要继承GsonHttpMessageConverter重写一个自己的消息转换器,使用GsonBuilder()设置序列化的一些参数


各Json序列化反序列化工具比较
https://blog.kedr.cc/posts/3646286038/
作者
zhuweitung
发布于
2021年5月1日
许可协议