Snippets: Java: Jackson

20th August 2020 at 2:19pm
Snippets: Java

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]]