本文介紹了將毫秒時間戳反序列化為java.time.Instant的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我嘗試使用Jackson讀取一個JSON文件,并將其中一個存儲為紀元毫秒的字段存儲為JavaInstant
,但是反序列化的行為并不像預期的那樣。
以下是我嘗試讀取時間戳時看到的情況:
1503115200000
Jackson正在將Instant
字段設置為+49601-10-28T16:00:00Z
。
這似乎是因為Jackson的默認設置是使用Instant.ofEpochSecond(Long l)
而不是Instant.ofEpochMilli(Long l)
讀取時間戳。
是否可以將JacksonObjectMapper
設置為使用ofEpochMilli
方法?這是我的ObjectMapper
當前擁有的內(nèi)容:
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 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);
這篇關于將毫秒時間戳反序列化為java.time.Instant的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,