Может ли Джексон анализировать значения даты и времени, которые не соответствуют ISO-8601? - PullRequest
2 голосов
/ 24 октября 2019

Я пытаюсь заставить Джексона проанализировать значения даты и времени, данные мне определенным API, которые я не могу изменить.

Поэтому я даю ему собственный шаблон:

public class Problem {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());

        String json = "{\"posted_at\":\"Mon, 14 Oct 2019 13:00:00 +0900\"}";
        Model model = mapper.readValue(json, Model.class);
        System.out.println(model.posted_at);
    }

    public static class Model {
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "E, d MMM yyyy HH:mm:ss XX")
        public ZonedDateTime posted_at;
    }
}

Я получаю это исключение:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Mon, 14 Oct 2019 13:00:00 +0900' could not be parsed at index 0

Кажется, что это происходит с ошибкой в ​​индексе 0, но я не понимаю, почему, потому что для шаблона дня недели "E",похоже, что "Mon" должно быть правильным значением.

До сих пор пробовал:

  • Установка DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE:

    mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
    

    Результат:то же исключение.

  • Добавление Jdk8Module:

    ObjectMapper mapper = new ObjectMapper()
       .registerModule(new Jdk8Module())
       .registerModule(new JavaTimeModule()); 
    

    Результат: то же исключение.

1 Ответ

2 голосов
/ 24 октября 2019

Джексон долгое время работал с Joda DateTime, и из вашего сообщения об ошибке кажется, что вы используете Java.DateTime для добавления поддержки Java dateTime, вам нужно добавить дополнительные зависимости "jackson-datatype-jdk8" см. https://github.com/FasterXML/jackson-modules-java8

<dependency>
 <groupId>com.fasterxml.jackson.datatype</groupId>
 <artifactId>jackson-datatype-jdk8</artifactId> 
</dependency>

Затем вы устанавливаете ADJUST_DATES_TO_CONTEXT_TIME_ZONE

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)

Затем вы добавляете новые модули

// Up to Jackson 2.9: (but not with 3.0)
ObjectMapper mapper = new ObjectMapper()
   .registerModule(new Jdk8Module())
   .registerModule(new JavaTimeModule()); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...