[英]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字符串。
如果您必須使用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.