пользовательская десериализация даты с форматом - PullRequest
3 голосов
/ 10 июня 2019

["last_modified"])] с основной причиной java.time.format.DateTimeParseException: текст '2018-06-06T13: 19: 53 + 00: 00' не может быть проанализирован, непарсированный текст найден в индексе19

Входящий формат: 2018-06-06T13:19:53+00:00
Это странный формат.

Я пробовал следующее:

public class XYZ {  
    @DateTimeFormat(pattern = "yyyy-MM-ddTHH:mm:ss+00:00", iso = ISO.DATE_TIME)
    private LocalDateTime lastModified;
}  

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Ничто не мешает вам создать свой собственный десериализатор.Очень наивный пример может быть следующим:

public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss+00:00";

    private final DateTimeFormatter formatter;

    public LocalDateTimeDeserializer() {
        this.formatter = DateTimeFormatter.ofPattern(PATTERN);
    }

    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return LocalDateTime.parse(p.getText(), formatter);
    }
}

Единственное, что вам нужно заметить, это то, что вам нужно экранировать 'T', добавив кавычки вокруг него.

Установив десериализатор, вы можете просто аннотировать поле следующим образом:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime dateTime;
1 голос
/ 10 июня 2019

Входящий формат: 2018-06-06T13:19:53+00:00
Это странный формат.

Это формат ISO 8601 , который одобрен RFC 3339 и xkcd 1179 :

xkcd 1179: ISO 8601


При получении значений в качестве параметров запроса должно работать следующее:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDate dateTime;

Поскольку 2018-06-06T13:19:53+00:00 представляет дату и время со смещением от UTC, лучше использовать OffsetDateTime, а не LocalDateTime:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private OffsetDateTime dateTime;

Просто убедитесь, что + закодировано как %2B.


С Джексоном вы можете добавить зависимость jackson-datatype-jsr310 в свое приложение. Этот модуль предоставит вам сериализаторы и десериализаторы для java.time типов.

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>${jackson.version}</version>
</dependency>

А затем зарегистрируйте модуль JavaTimeModule в своем ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Джексон будет заниматься сериализацией и десериализацией для вас.

Если вы по какой-то причине не заинтересованы в смещении от UTC и хотите продолжать использовать LocalDateTime, вы можете расширить LocalDateTimeDeserializer, предоставленные Джексоном и использовать пользовательский DateTimeFormatter:

public class CustomLocalDateTimeDeserializer extends LocalDateTimeDeserializer {

    public CustomLocalDateTimeDeserializer() {
        super(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    }
}

Затем аннотируйте поле LocalDateTime, как показано ниже:

@JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
private LocalDateTime dateTime;
0 голосов
/ 10 июня 2019

Входящий формат: 2018-06-06T13: 19: 53 + 00: 00

Если вы можете установить формат даты для всего объекта ObjectMapper, вы можете сделатьследующее:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
objectMapper.setDateFormat(df);

Это часть примеров из SimpleDateFormat Javadocs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...