Джексон deserialize ISO8601 fromatted дата-время в Java8 Мгновенное действие
Я пытаюсь десериализовать дату форматирования ISO8601 в Java8 Instant, используя Jackson. Я зарегистрировал JavaTimeModule с ObjectMapper, отключил WRITE_DATES_AS_TIMESTAMPS.
Однако, если вы попытаетесь десериализовать 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 без написания пользовательского десериализатора?
Ответы
Ответ 1
Вам нужно установить явный часовой пояс через XXX
в классе вашего модуля:
@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)
Ответ 2
Формат "Z" не работает с "+01: 00", поскольку это другой шаблон.
JsonFormat использует шаблоны SimpleDateFormat. "Z" в верхнем регистре представляет только строгий RFC 822. Вы должны использовать синтаксис, например: "+0100", без двоеточия.
Смотрите: ISO 8601: 2004, Шаблоны SimpleDateFormat