因为公司一些不可名状的要求,全组行动,将一个大型java后端工程中的fastjson改成了jackson,记录改造期间出现的一些问题。
版本说明:
fastjson(1.2.83)
jackson(2.13.3)
- 对JSON对象的定义
fastjson 使用 JSONObject (com.alibaba.fastjson.JSONObject)
jackson 使用 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)
举例:
用fastjson的话定义JSON List 使用 List<JSONObject>
用jackson的话定义 JSON List 使用 List<ObjectNode>
JSONObject.class -> ObjectNode.class
- 对JSON数组的定义
fastjson 使用 JSONArray (com.alibaba.fastjson.JSONArray)
jackson 使用 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode) - 反序列化的实现
例如:在反序列化entity时,实现snake_case转化为camelCase
对下面这样的Student类
public class Student implements Serializable {
private String studentId
// ...
}
// fastjson 使用JSONField注解
public class Student implements Serializable {
@JSONField(name = "student_id")
private String studentId;
// ...
}
// jackson使用JsonProperty注解
public class Student implements Serializable {
@JsonProperty(value = "student_id")
private String studentId;
// ...
}
注意:这个实现和fastjson不同,如果从fastjson转过来用,会有坑
使用jackson的JsonProperty注解之后,对象数据传递给前端的时候,再次序列化还会转化回 snake_case;(fastjson不同,fastjson序列化之后会保持camelCase) 。
如果前端需要camelCase的数据,还需要手动进行一次DTO转换。
在确定反序列化将snake_case转化为camelCase,此后反序列化依然保持camelCase的情况下,推荐使用jackson的JsonAlias注解
// jackson 使用 JsonAlias注解
public class Student implements Serializable {
@JsonAlias(value ={ "student_id", "studentId"})
private String studentId;
// ...
}
JsonAlias可以在反序列化的时候将 "student_id", "studentId" 都转化为studentId。
且接口输出(传递回前端)的时候会使用反序列化之后指定的"studentId", 避免一次DTO的手动转换。
(推荐使用 JsonAlias , 大部分的场景都是这样的)
序列化:对象 -> 可存储/传输的格式(字节流、文本)
反序列化:可存储/传输的格式(字节流、文本) -> 对象
- 从JSON数组中取值并转为指定格式
对JSON数组JSONArray。
fastjson
dataArray.getString(1);
dataArray.getDouble(2);
jackson
dataArray.get(1).asText();
dataArray.get(2).asDouble();
同步更新到自己的语雀
https://www.yuque.com/dirackeeko/wxkg90/vlkpi205iatbvdqg
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。