将毫秒时间戳反序列化为 java.time.Instant

我试图使用Jackson读取JSON文件,并将其中一个字段存储为一个纪元毫秒作为Java,但是反序列化的行为不符合预期。Instant

以下是我在尝试读取时间戳时看到的内容:

1503115200000

杰克逊将字段设置为 .Instant+49601-10-28T16:00:00Z

这似乎是因为 Jackson 的默认设置是使用 而不是 读取时间戳。Instant.ofEpochSecond(Long l)Instant.ofEpochMilli(Long l)

有没有办法将杰克逊设置为使用该方法?这就是我目前为我的:ObjectMapperofEpochMilliObjectMapper

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:00Z1503115200Instant

不幸的是,JSON输入必须是纪元毫秒,例如.1503115200000


答案 1

解决方案是添加到对象映射器。Complete ObjectMapper 看起来像这样:.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false)

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

答案 2

对于那些使用Spring Boot并在休息请求反序列化期间遇到此问题的人 - 在应用程序中提供以下信息。属性:

spring.jackson.deserialization.read-date-timestamps-as-nanoseconds=false

@JB Nizet的答案是正确的,但是由于Spring Boot内部有自己的ObjectMapper - 您需要在属性中配置此值。