最近写一个分布式定时任务框架,里面需要对Java对象进行序列化,在技术选型上,写下这篇文章来进行思考和比对。
1.GSON(功能最强大,性能稍逊)
GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。
基础用法如下
private static Gson gson = null;
static {
gson= new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
}
/**
* Object 转成 json
*
* @param src
* @return String
*/
public static String toJson(Object src) {
return gson.toJson(src);
}
/**
* json 转成 特定的cls的Object
*
* @param json
* @param classOfT
* @return
*/
public static <T> T fromJson(String json, Class<T> classOfT) {
return gson.fromJson(json, classOfT);
}
优势和缺陷:
- 易于使用
- 性能相对较好
- 支持注解和泛型
- 无法处理复杂的嵌套关系
- 对于大型JSON文件,可能会占用较多内存(很容易导致GC问题)
2.FastJSON (慎用,除非要求极致的速度)
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
//可以使用 JSON.toJSONString() 将 Java 对象转换换为 JSON 对象
String jsonOutput= JSON.toJSONString(这里填java对象);
//我们可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。
//注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常:
Person person = new Person(20, "John", "Doe", new Date());
String jsonObject = JSON.toJSONString(person);
Person newPerson = JSON.parseObject(jsonObject, Person.class);
fastjson的优点:
- 高性能:fastjson是一个高性能的JSON库,拥有较快的序列化和反序列化速度。
- 简单易用:fastjson提供了简单易用的API,使得使用者可以快速上手并进行JSON的处理。
- 支持自定义序列化和反序列化:fastjson支持自定义序列化和反序列化,使得开发者可以根据自身需求灵活地处理JSON数据。
- 支持多种数据类型:fastjson支持序列化和反序列化多种数据类型,包括基本数据类型、自定义对象、集合等。
- 支持跨语言:fastjson可以在多种编程语言中使用,包括Java、C++、Python等。
fastjson的缺点:
- 安全性问题:fastjson在处理JSON数据时存在一些安全性问题,容易受到JSON注入攻击。
- 缺少官方文档:fastjson的官方文档相对较少,开发者可能需要通过阅读源码或查找第三方资料来学习和使用。
- 社区支持相对较弱:相比于其他JSON库如Jackson和Gson,fastjson的社区支持相对较弱,开发者可能难以找到相应的解决方案。
- 较小的用户群体:由于fastjson的社区支持较弱,使用fastjson的用户群体相对较小,可能难以找到相关的经验和资源。
3.Jackjson (功能较强,性能较好,拓展性好)
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。
默认情况下,Jackson通过将JSON字段的名称与Java对象中的getter和setter方法进行匹配,将JSON对象的字段映射到Java对象中的属性。 Jackson删除了getter和setter方法名称的“ get”和“ set”部分,并将其余名称的第一个字符转换为小写。
例如,名为brand的JSON字段与名为getBrand()和setBrand()的Java getter和setter方法匹配。 名为engineNumber的JSON字段将与名为getEngineNumber()和setEngineNumber()的getter和setter匹配。
ObjectMapper objectMapper = new ObjectMapper();
Person person = new Person(20, "John", "Doe", new Date());
String json = objectMapper.writeValueAsString(person);
Person person = objectMapper.readValue(json, Person.class);
jackjson的优点:
- 解析大文件的速度比较快;
- 运行时占用的内存比较少,性能更佳;
- API 很灵活,容易进行扩展和定制。
jackjson的缺点:
- Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。
- Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式