2016-03-27 1 views
16

Я пытаюсь десериализовать дату форматирования ISO8601 в Java8 Мгновенно используя Джексон. Я зарегистрировал JavaTimeModule с ObjectMapper, отключил WRITE_DATES_AS_TIMESTAMPS.Jackson deserialize ISO8601 fromatted date-time в Java8 Instant

Однако, если вы попытаетесь десериализовать 2016-03-28T19: 00: 00.000 + 01: 00, это не сработает, потому что кажется, что JavaTimeModule будет только десериализовать дату-время, отформатированное с учетом смещения часовой пояс UTC (например, 2016-03 -28T18: 00: 00.000Z). Затем я попытался с помощью @JsonFormat аннотацию, как это:

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

И как это:

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

Однако ни одна из этих работ, и я получаю исключение:

com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"]) 

что означает, что параметр часового пояса игнорируется, а формат времени даты не знает, как отформатировать Instant без часового пояса.

Есть ли способ десериализации строки ISO8601, которая не соответствует смещению часовой пояс UTC к Java 8 Мгновенный запуск использования Jackson и JavaTimeModule без написания пользовательского десериализатора?

+0

странно, я ожидал эту ошибку 'Не удалось разобрать значение 'Дата 2016-03-28T19: 00: 00,000 + 01: 00' (формат:«YYYY-MM-dd'T «HH: mm: ss.SSSZ»): Невозможная дата: «2016-03-28T19: 00: 00.000 + 01: 00» «и после попытки вашего кода я получил такую ​​ошибку в обоих случаях. Формат не соответствует ... вы пробовали его без каких-либо аннотаций? –

+0

или с этим рисунком: yyyy-MM-dd'T'HH: mm: ss.SSSXXX (см. Https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html) –

+0

Без каких-либо аннотаций он работает, но только если смещение указано как Z. Оно не будет работать для +0100 или +01: 00. Я попробовал ваш формат, и я все равно получаю поле Unsupported: исключение YearOfEra, указывающее, что форматировщик десериализатора не настроен с часовым поясом (по какой-то причине java 8 fromatter требует TZ, даже если смещение указано в строке, а Instant полностью определено) , –

ответ

11

Вы должны установить явную временную зону с помощью XXX в классе Modell:

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

(см: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)

+1

Использование предложенного формата наряду с размещением аннотации в правильном месте разрешило проблему. –

0

Формат "Z" не работает с "+01: 00" так как это другой шаблон. JsonFormat использует шаблоны SimpleDateFormat. «Z» в В верхнем регистре представлен только строгий RFC 822. Вы должны использовать синтаксис типа «+0100», без двоеточия.

См: ISO 8601:2004, SimpleDateFormat patterns

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