2016-11-08 1 views
3

들어오는 JSON에서 영역 오프셋을 포함하는 ISO8601 호환 datetime 필드가 있습니다. 이 오프셋을 보존하고 싶습니다만, 불행히도 잭슨의 GMT/UTC 기본값은이 필드를 역 직렬화하는 동안입니다 (내가 이해 한 내용은 http://wiki.fasterxml.com/JacksonFAQDateHandling입니다).OffsetDateTime을 deserialize하는 동안 오프셋을 보존하는 방법

java.lang.AssertionError: expected:<-04:00> but was:<Z> 

는 어떻게 반환 OffsetDateTime 원래 오프셋 포함 할 수 있습니다 :

@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 
} 

내가 여기서 뭘되어지고있어?

저는 잭슨 2.8.3에 있습니다.

답변

7

개체 매퍼를 변경하여 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(); 
+0

신난다, 고마워! 잭슨 내부를 파고 들었을 때, 혼자서 알아 냈습니다. –

0

당신은

objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 

을 시도 할 수 있을까요?

링크 된 FAQ에 따르면, 1970-01-01T00:00:00.000+0000 형식을 제공해야합니다. 이 형식에는 시간대 오프셋 (+0000)이 포함됩니다.

+0

이미 Jackson2ObjectMapperBuilder를 통해 사용할 수 있습니다. 다행히도, 나는 해결책을 찾았습니다. –

관련 문제