因为公司一些不可名状的要求,全组行动,将一个大型java后端工程中的fastjson改成了jackson,记录改造期间出现的一些问题。

版本说明:
fastjson(1.2.83)
jackson(2.13.3)

  1. 对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

  1. 对JSON数组的定义
    fastjson 使用 JSONArray (com.alibaba.fastjson.JSONArray)
    jackson 使用 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)
  2. 反序列化的实现

例如:在反序列化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 , 大部分的场景都是这样的)

序列化:对象 -> 可存储/传输的格式(字节流、文本)
反序列化:可存储/传输的格式(字节流、文本) -> 对象

  1. 从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


DiracKeeko
125 声望2 粉丝