您可以指定帶有可選部分(由[]
分隔)的模式,以指示偏移量可以有2種不同的格式,並使用@JsonFormat
註釋將其添加到相應的字段。
我已經創建這個測試類:
public class SampleType {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss[XXX][XX]")
private ZonedDateTime date;
// getter and setter
}
注意的最後部分([XXX][XX]
):每對[]
是一個可選的部分,所以解析器嘗試來分析每一個,如果存在的話。 XXX
與:
和XX
偏移時也沒有偏移(更多詳情,看看在javadoc)
有了這個,這兩種格式可以讀取:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
// offset with ":"
String json = "{ \"date\": \"2017-03-28T14:40:00+01:00\" }";
SampleType value = mapper.readValue(json, SampleType.class);
System.out.println(value.getDate()); // 2017-03-28T13:40Z[UTC]
// offset without ":"
json = "{ \"date\": \"2017-03-28T14:40:00+0100\" }";
value = mapper.readValue(json, SampleType.class);
System.out.println(value.getDate()); // 2017-03-28T13:40Z[UTC]
注意將得到的ZonedDateTime
的值轉換爲UTC:2017-03-28T13:40Z[UTC]
如果要保留原始偏移量,只需使用com.fasterxml.jackson.databind.DeserializationFeature
類來配置ObjectMapper
:
// add this to preserve the same offset (don't convert to UTC)
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
由此,偏移被保留(值不轉換爲UTC),和上述輸出爲測試將是2017-03-28T14:40+01:00
。
據我所知,JavaTimeModule只能「理解」ISO格式,它需要時區中的「':'」。您可能需要編寫一個自定義(de)序列化程序。這不應該太複雜。 – assylias