如何在使用Jackson反序列化OffsetDateTime时保留偏移量

Mac*_*ież 7 java json jackson java-time

在传入的JSON中,我有一个符合ISO8601标准的日期时间字段,包含区域偏移量.我想保留这个偏移量,但不幸的是Jackson在反序列化这个字段时默认为GMT/UTC(我从http://wiki.fasterxml.com/JacksonFAQDateHandling中了解到).

@RunWith(JUnit4.class)
public class JacksonOffsetDateTimeTest {

    private ObjectMapper objectMapper;

    @Before
    public void init() {
        objectMapper = Jackson2ObjectMapperBuilder.json()
            .modules(new JavaTimeModule())
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .build();
    }

    @Test
    public void test() throws IOException {
        final String json = "{ \"date\": \"2000-01-01T12:00:00.000-04:00\" }";
        final JsonType instance = objectMapper.readValue(json, JsonType.class);

        assertEquals(ZoneOffset.ofHours(-4), instance.getDate().getOffset());
    }
}


public class JsonType {
    private OffsetDateTime date;

    // getter, setter
}
Run Code Online (Sandbox Code Playgroud)

我在这里得到的是:

java.lang.AssertionError: expected:<-04:00> but was:<Z>
Run Code Online (Sandbox Code Playgroud)

如何使返回的OffsetDateTime包含原始偏移量?

我在Jackson 2.8.3上.

use*_*814 19

将Object Mapper更改为此选项可禁用ADJUST_DATES_TO_CONTEXT_TIME_ZONE.

objectMapper = Jackson2ObjectMapperBuilder.json()
            .modules(new JavaTimeModule())
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
            .build();
Run Code Online (Sandbox Code Playgroud)