Джексону не удалось разобрать ISO8601 - PullRequest
4 голосов
/ 26 марта 2020

Мы получаем HttpResponse с датой в виде одного атрибута json, дата форматируется в ISO8601 (например, 2020-03-13T00: 00: 35.570 + 0000), но Джексон выдает следующее исключение:

java.time.format.DateTimeParseException: Text '2020-03-13T00:00:35.570+0000' could not be parsed at index 23

Я написал следующий тест (спок), который невозможно воспроизвести. Мне нужно знать, как разобрать дату. Спасибо за вашу помощь!

class TestJackson extends Specification{

    def 'test date format'(){
        given:
        def jsonString = """{"myDate":"2020-03-13T00:00:35.570+0000"}"""

        and:
        def objectMapper = new ObjectMapper()
                .registerModule(new JavaTimeModule())
                .enable(SerializationFeature.INDENT_OUTPUT)
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        when:
        def resp = objectMapper.readValue(jsonString, Response)

        then:
        resp.myDate != null
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    static class Response {
        ZonedDateTime myDate
    }
}

В тесте используются следующие зависимости:

  • com.faster xml .jackson.core: jackson-databind: 2.10.3
  • com.faster xml .jackson.datatype: jackson-datatype-jsr310: 2.10.3

1 Ответ

4 голосов
/ 26 марта 2020

Джексон не проблема здесь; вы бы получили то же исключение, если бы вы позвонили ZonedDateTime.parse("2020-03-13T00:00:35.570+0000"). Согласно API , ZonedDateTime использует DateTimeFormatter.ISO_ZONED_DATE_TIME для анализа. ISO_ZONED_DATE_TIME - это

дата-время со смещением и зоной, например, '2011-12-03T10: 15: 30 + 01: 00 [Европа / Париж]'

Значение, которое вы пытались проанализировать, имеет смещение, но не имеет зоны, поэтому вам необходимо преобразовать его в OffsetDateTime, который использует DateTimeFormatter.ISO_OFFSET_DATE_TIME для анализа. DateTimeFormatter.ISO_OFFSET_DATE_TIME

... анализирует дату и время со смещением, например, '2011-12-03T10: 15: 30 + 01: 00'.

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