如何使用不同的日期格式进行序列化和反序列化?

How do I use different date formats for serialization & deserialization?

我得到一个日期字段格式为 2022-02-11 的对象,我将其映射到一个对象中,如下所示:

{ "dateTimeField": "2022-02-11" }
@Data
class MyPojo {
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date dateTimeField;
}

现在我需要将此对象作为 json 响应发送,但我需要它采用不同的格式:

{ "dateTimeField": "2022-02-11 00:00:00" }

如果我更改 pattern 字段,反序列化失败:

@Data
class MyPojo {
    // com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2022-02-11": expected format "yyyy-MM-dd HH:mm:ss"
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dateTimeField;
}

如何使用不同的模式进行序列化和反序列化?

这可以在字段的 getter 和 setter 上使用单独的注释来完成:

@Data
class MyPojo {

    private Date dateTimeField;

    // Used during serialization
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    public Date getDateTimeField() {
        return dateTimeField;
    }

    // Used during deserialization
    @JsonFormat(pattern = "yyyy-MM-dd")
    public void setDateTimeField(Date dateTimeField) {
        this.dateTimeField = dateTimeField;
    }
}

或者,使用 Lombok 的(从 2022 年 2 月 11 日开始试验)onX 功能:

@Data
class MyPojo {
    @Getter(onMethod_ = {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")}) // Used during serialization
    @Setter(onMethod_ = {@JsonFormat(pattern = "yyyy-MM-dd")})          // Used during deserialization
    private Date dateTimeField;
}