簡體   English   中英

將毫秒時間戳反序列化為java.time.Instant

[英]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或更改為紀元秒(例如1503115200Instant字段可以正確設置。

不幸的是,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);

來自https://github.com/FasterXML/jackson-modules-java8/blob/master/datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/JavaTimeModule.java

如果啟用{@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.

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