簡體   English   中英

如何發送/接收日期 object 以 JSON 中的不同格式而不是時間戳?

[英]How to send/receive a date object to be in a different format in JSON and not in timestamp?

我有以下 POJO,我用它作為消息發送到 rabbitmq:

public class MyMessage {
    private String id;
    private String name;
    private Date createdDt;

    @JsonCreator
    public MyMessage(
        @JsonProperty("id") String id,
        @JsonProperty("name") String name,
        @JsonProperty("createdDt") Date createdDt
    ) {
        this.id = id;
        this.name = name;
        this.createdDt = createdDt;
    }
}

問題在於,當我使用rabbitTemplate.convertAndSend()發送它時, createdDt將位於 JSON 消息中的 unix 時間戳中。 我需要序列化后createdDt中的 createdDt 格式為dd-MM-yyyy HH:mm:ss

我不想將MyMessage class 中的createdDt屬性更改為該格式化日期中的字符串,因為我可能想在代碼中的其他位置使用 POJO,並且將日期作為字符串稍后不方便。 僅僅為了將日期設置為特定格式而將日期放在字符串中聽起來也不“正確”。

當我收到回復的消息時,我還需要將dd-MM-yyyy HH:mm:ss格式的字符串日期反序列化回Date object。

如何將createdDt保留為Date object,同時在序列化時以不同的格式發送日期,然后將字符串反序列化為日期 object?

我建議不要使用java.util.Date但更喜歡 Java 8+ 時間 API。 在這種情況下,您可以通過模塊com.fasterxml.jackson.datatype:jackson-datatype-jsr310和...導入 Jackson 的內置支持。

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

... 默認情況下,將LocalDateTime呈現為ISO 8601字符串。

Ref: https://fasterxml.github.io/jackson-datatype-jsr310/javadoc/2.7/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.html

如果您必須使用java.util.Date則只需將以下注釋添加到createdDt字段

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
private Date createdDt;

有了關於字段序列化/反序列化的特定要求,我建議使用自定義序列化器/反序列化器。

public class CustomDateSerializer extends StdSerializer<Date> {
 
    @Override
    public void serialize(Date value, JsonGenerator generator, SerializerProvider provider) 
        throws IOException, JsonProcessingException {

        // your implementation
    }
}

public class CustomDateDeserializer extends StdDeserializer<Item> { 

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {

      // your implementation
    }
}

然后你可以像這樣簡單地標記createdDt

public class MyMessage {
    private String id;
    private String name;
    private Date createdDt;

    @JsonCreator
    public MyMessage(
        @JsonProperty("id") String id,
        @JsonProperty("name") String name,
        @JsonProperty("createdDt") @JsonDeserialize(using = CustomDateDeserializer.class) @JsonSerialize(using = CustomDateSerializer.class) Date createdDt
    ) {
        this.id = id;
        this.name = name;
        this.createdDt = createdDt;
    }
}

通過這種方式,您可以指示 Jackson 在特定字段上使用您的特定序列化器/解串器。

如果您想在ObjectMapper級別上應用配置,您可以通過這樣的模塊注冊來實現它:

SimpleModule myModule = new SimpleModule();
myModule.addSerializer(Date.class, new CustomDateSerializer());
myModule.addDeserializer(Date.class, new CustomDateDeserializer());

objectMapper.registerModule(myModule);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM