2015-10-20 2 views
3
@Test 
public void testJacksonOffsetDateTimeDeserializer() throws IOException { 
    ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); 
    String json = "\"2015-10-20T11:00:00-8:30\""; 

    mapper.readValue(json, OffsetDateTime.class); // boom! 
} 

java.time.format.DateTimeParseException: Text '2015-10-20T11:00:00-8:30' could not be parsed at index 19 
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) 

Использование версии 2.6.3Джексон JSR-310 модуль не десериализовать простейший формат OffsetDateTime

Не помогает даже если отключить SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE и включить SerializationFeature.WRITE_DATES_WITH_ZONE_ID.

По-видимому, он действительно хочет формат INSTANT, например 2015-10-20T11: 00: 00Z, без часового пояса. Что для OffsetDateTime бесполезно, потому что все дело в том, чтобы использовать часовой пояс (или смещение).

Любые идеи?

Полное раскрытие информации: У меня есть issue открыт на их Github.

ответ

1

Это была проблема с отсутствующим нулем для смещения, то есть 8:30 вместо 08:30. Видимо, DateTimeFormatter#ISO_OFFSET_DATE_TIME очень строг. Я проверил, используя все 3 java.time.format.ResolverStyle, и никто не работал, когда отсутствовал нулевой фронт. Вы могли бы подумать, что ResolverStyle.LENIENT или ResolverStyle.SMART будет работать, пока ResolverStyle.STRICT может потерпеть неудачу, но nops.

Благодаря ребятам из команды Jackson dev.

Смежные вопросы