Jackson 是 JSON 序列化、反序列化的库类。Spring 默认使用它。
Setup
public class StandardContainerApiUtil {
public static final Objec
static {
// 反序列化时忽略不存在的属性
OM.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
// 序列化 Date 对象时不序列化成 timestamp
OM.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
}
从 String 反序列化
String result = "{\"createAt\": \"2008-09-15T15:53:00+05:00\"}";
OM.readValue(result, StandardCluster.class);
序列化为 String
StandardCluster cluster = new StandardCluster();
cluster.setCreateAt(new Date());
String result = OM.writeValueAsString(cluster);
控制类字段是否被序列化
Jackson 默认会解析类中全部 getter 函数(即 getXXX
的函数,不管它是不是对应着一个字段)及 fields,用来判断要序列化成什么样子。
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StandardCluster {
@JsonInclude(JsonInclude.Include.ALWAYS)
private String id;
private String name;
private String status;
private String cidr;
private Integer nodeNum;
private Date createAt;
private Date updateAt;
@JsonIgnore
public String getNodeNumDesc() {
return "Node num: " + String.valueOf(nodeNum);
}
// ...
}
处理日期
JSON 中没有表示日期的基本类型,你需要把它序列化为 string。我对日期的标准不熟悉,了解到比较常用的有 ISO 8601。Jackson 中有专门处理的 ISO8601DateFormat
,但是根据这个 issue,它在 2.9 版本中被 deprecated 了。Jackson 建议直接用默认的 StdDateFormat
。根据 文档,与 java.util.Data
类型互操作时:
- 序列化时会生成 ISO-8601 兼容的字符串
- 反序列化时可以识别 ISO-8601 和 RFC-1123 格式的字符串
不过注意 Jackson 默认会把 Date
类型的字段序列化成 UNIX Timestamp。你可以通过 disable 掉 Objec
!! 参考
* [[Jackson - baeldung|https://www.baeldung.com/jackson]]