各Json序列化与反序列化工具比较
本文主要比较Java中fastjson
、jackson
、gson
三个包的序列化与反序列化性能,可拓展性,易用性等。
开发环境:
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 {
public static String serialize(Object object) { if (object == null) { return null; } return JSON.toJSONString(object); }
public static <T> T deserializeObj(String json, Class<T> clazz) { if (StringUtils.isBlank(json)) { return null; } return JSON.parseObject(json, clazz); }
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();
public static String serialize(Object object) { if (object == null) { return null; } try { return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return null; }
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; }
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();
public static String serialize(Object object) { if (object == null) { return null; } return gson.toJson(object); }
public static <T> T deserializeObj(String json, Class<T> clazz) { if (StringUtils.isBlank(json)) { return null; } return gson.fromJson(json, clazz); }
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
的转换器中
实现SerializeFilter
、AfterFilter
等接口,再将实现类加入转换参数中
jackson
将MappingJackson2HttpMessageConverter
加入HttpMessageConverter
的转换器中
jackson自定义序列化提供JsonSerializer
和StdSerializer
两个抽象类
gson
将GsonHttpMessageConverter
加入HttpMessageConverter
的转换器中
不满足序列化要求时,需要继承GsonHttpMessageConverter
重写一个自己的消息转换器,使用GsonBuilder()
设置序列化的一些参数