![](/img/trans.png)
[英]Cannot deserialize value of type `java.time.Instant` - jackson
[英]Deserialize millisecond timestamp to java.time.Instant
我正在嘗試使用Jackson讀取JSON文件,並將其中一個字段存儲為紀元毫秒作為Java Instant
,但反序列化的行為不符合預期。
以下是我在嘗試閱讀時間戳時看到的內容:
1503115200000
傑克遜將Instant
字段設置為+49601-10-28T16:00:00Z
。
這似乎是因為Jackson的默認值是使用Instant.ofEpochSecond(Long l)
而不是Instant.ofEpochMilli(Long l)
來讀取時間戳。
有沒有辦法將Jackson ObjectMapper
設置為使用ofEpochMilli
方法? 這是我目前對我的ObjectMapper
:
ObjectMapper om = new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.setSerializationInclusion(Include.NON_NULL);
注意
如果我將輸入JSON更改為ISO日期(例如2017-08-19T04:00:00Z
或更改為紀元秒(例如1503115200
則Instant
字段可以正確設置。
不幸的是,JSON輸入必須是紀元毫秒,例如1503115200000
。
解決方案是將.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
到ObjectMapper。 完整的ObjectMapper看起來像:
ObjectMapper om = new ObjectMapper()
.registerModule(new JavaTimeModule())
.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
.setSerializationInclusion(Include.NON_NULL);
如果啟用{@code READ_DATE_TIMESTAMPS_AS_NANOSECONDS}(默認情況下),則更不明確的整數類型將被讀取為沒有小數點的小數秒,否則它們將被讀取為毫秒。
因此,您需要禁用READ_DATE_TIMESTAMPS_AS_NANOSECONDS。
對於那些使用Spring Boot並在休息請求反序列化期間遇到此問題的人 - 請在application.properties中提供:
spring.jackson.deserialization.read-date-timestamps-as-nanoseconds=false
@JB Nizet的答案是正確的,但由於Spring Boot里面有自己的ObjectMapper,你需要在屬性中配置這個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.