Рубрики
Без рубрики

Настройте, как Джексон выполняет синтаксический анализ локальных данных

Расскажите Джексону, как проанализировать ответ JSON, содержащий строку даты, в объект LocalDate на Java. Помеченный java, jackson, api.

Jackson является наиболее широко используемой библиотекой JSON синтаксического анализатора/генератора в экосистеме Java и является зависимостью по умолчанию от Spring Boot .

Даты бывают разных форматов, и это проблема, когда мы хотим перейти от поля даты в JSON к Java Локальная дата объект.

Что это значит?

Например, в Gear Приятель ,

JSON не имеет типа “данные”, поэтому вы передаете строку для даты в запросе. В Gear Buddy запрос выглядит так (обратите внимание на последнее поле):

{
    "type": "Tent",
    "model": "Montana",
    "brand": "Coleman",
    "size": "8-person",
    "purchaseDate": "10/21/2016"
}

Единственная проблема заключается в том, что если вы отправите этот запрос в приложение, это приведет к следующей ошибке:

{
    "timestamp": "2019-06-07T21:19:47.500+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Cannot deserialize value of type `java.time.LocalDate` from String \"10/21/2016\": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '10/21/2016' could not be parsed at index 0; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String \"10/21/2016\": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '10/21/2016' could not be parsed at index 0\n at [Source: (PushbackInputStream); line: 6, column: 18] (through reference chain: org.gearbuddy.requests.PostGearRequestBody[\"purchaseDate\"])",
    "path": "/gear"
}

Почему это не сработает

Причина, по которой приложение злится, не совсем ясна из сообщения об ошибке, но это потому, что переданная строка даты (“21.10.2016”) не в формате, который Джексон может проанализировать. Возможно, некоторым из вас это покажется странным, потому что “21.10.2016” – распространенный способ написания даты в Соединенных Штатах.

Но Джексон по умолчанию понимает только международный формат гггг-ММ-дд, что означает, что если мы изменим наш запрос на “2016-10-21”, то запрос будет работать нормально.

Что может оказаться бесполезным для пользователей вашего приложения.

Так что измени это

Вы можете (конечно!) измените формат, понятный Джексону.

Способ сделать это – добавить аннотацию @JsonFormat к соответствующему полю в вашем объекте Java.

@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
public PostGearRequestBody(
        @JsonProperty("type") String type, 
        @JsonProperty("brand") String brand,
        @JsonProperty("model") String model, 
        @JsonProperty("color") String color,
        @JsonProperty("size") String size, 
        @JsonProperty("purchasePlace") String purchasePlace,
        @JsonProperty("purchasePrice") String purchasePrice,
        @JsonProperty("purchaseDate") @JsonFormat(pattern = "MM/dd/yyyy") LocalDate purchaseDate,
        @JsonProperty("warranty") String warranty) {
    // ... etc
}

Обратите внимание, что предпоследний параметр метода имеет как аннотацию @JsonProperty , так и формат Json аннотация:

// ...
@JsonProperty("purchaseDate") @JsonFormat(pattern = "MM/dd/yyyy") LocalDate purchaseDate,
// ...

Вы можете прочитать больше о @JsonFormat в документации по API Джексона .

С учетом этого изменения и компиляции приложения запрос с датой в формате “21.10.2016” теперь успешно работает!

Примечание: Первоначально опубликовано на Примечание: Первоначально опубликовано на .

Оригинал: “https://dev.to/scottshipp/customize-how-jackson-does-localdate-parsing-2hc5”