Java Spring: десериализация Джексона в ZonedDateTime - PullRequest
0 голосов
/ 24 января 2019

Предполагая следующий класс, который я хочу использовать для десериализации из внешней полезной нагрузки JSON:

public class MyObject {

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

}

Когда я пытаюсь использовать полезную нагрузку JSON, Джексон выдает следующую ошибку:

Cannot deserialize value of type `java.time.ZonedDateTime` from String "2019-01-23T12:54:18.610Z": Failed to deserialize java.time.ZonedDateTime: (java.time.format.DateTimeParseException) Text '2019-01-23T12:54:18.610Z' could not be parsed at index 23

Как видите, входящая строка - "2019-01-23T12:54:18.610Z", что, как я понимаю, является действительным ZonedDateTime.Используя jshell, синтаксический анализ этой строки в ZonedDateTime с использованием ZonedDateTime.parse("2019-01-23T12:54:18.610Z") приводит к допустимому ZonedDateTime, как и следовало ожидать.

  • Почему здесь происходит сбой Джексона?
  • Что я могу сделать, чтобы сделатьэто работает?

Я тоже не эксперт по Спрингу или Джексону.Спасибо.

Редактировать: я использую Spring Boot v2.1.1.RELEASE.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы должны заменить Z на X, как yyyy-MM-dd'T'HH:mm:ss.SSSX.

См. документ :

Symbol  Meaning                     Presentation      Examples
X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
0 голосов
/ 24 января 2019

Z в шаблоне не примет литерал 'Z' в значении, использование X вместо этого должно работать:

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

Шаблон указан как Java SimpleDateFormat - ссылка на Java 10 здесь .

...