将毫秒时间戳反序列化为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当前拥有的内容:

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);

相关文章