Десериализовать время Зулу в формате ISO8601 в Джексоне

Мне нужно десериализовать время формата 2016-11-28T10:34:25.097Z, используя Джексона, в ZonedDateTime Java8.

Я считаю, что правильно настроил ObjectMapper (фабричный метод):

 @Bean
ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    // some other config...
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;
}

А у меня в коде для DTO есть поле

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private ZonedDateTime updatedAt;

когда я пытаюсь разобрать это Джексоном, я получаю

 java.lang.IllegalArgumentException: Can not deserialize value of type java.time.ZonedDateTime 
 from String "2016-11-28T10:34:25.097Z": Text '2016-11-28T10:34:25.097Z' could not be parsed,
 unparsed text found at index 23  at [Source: N/A; line: -1, column: -1]  

Без @JsonFormat проблема остается.

Как я мог преодолеть это?


person Askar Ibragimov    schedule 28.11.2016    source источник


Ответы (3)


Проблема, вероятно, с буквой «Z» в шаблоне. Он не допускает буквального «Z» в значении даты и времени. Вместо этого попробуйте «X».

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX")
person pkalinow    schedule 28.11.2016

Мне нужно было сериализовать/десериализовать дату в формате ISO8601 Zulu 2016-11-28T10:34:25.097Z, как и вы

Я решил изменить средство форматирования даты в ObjectMapper, используя ISO8601DateFormat.

как это

@Bean
ObjectMapper getObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    // some other config...
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.setDateFormat(new ISO8601DateFormat());
    return objectMapper;
}
person Quentin    schedule 17.12.2019

На мой взгляд, следующий JsonFormat для ISO 8601

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")

намного лучше, поскольку этот формат более интуитивно понятен и позволяет использовать часовые пояса, такие как ACST, со смещением UTC +09:30.

person Philipp Wirth    schedule 25.06.2018