Sonackson является наиболее широко используемой библиотекой синтаксического анализатора / генератора ĴSON в экосистеме Java и является зависимостью по умолчанию от Spring Boot .
Даты бывают разных форматов, и это проблема, когда мы хотим перейти от поля даты в JSON к объекту Java Localdate .
Что это значит?
Например, в GearBuddy , моем приложении для управления снаряжением на открытом воздухе, вы можете отслеживать, когда вы приобрели каждый предмет снаряжения с помощью поля purchaseDate. Это дата без времени, и идея заключается в том, что вы поставили ее 24 мая 1995 года или когда вы ее купили.
JSON не имеет типа «дата», поэтому вы можете передать строку для даты в запросе. В GearBuddy запрос выглядит следующим образом (обратите внимание на последнее поле):
{
"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 октября 2016 года») не в том формате, который Джексон может проанализировать. Для некоторых людей это может быть странно, потому что «21.10.2016» - это распространенный способ написания дат в Соединенных Штатах.
Но Джексон знает только международный формат yyyy-MM-dd по умолчанию, что означает, что если мы изменим запрос на «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 и аннотацию JsonFormat:
// ...
@JsonProperty("purchaseDate") @JsonFormat(pattern = "MM/dd/yyyy") LocalDate purchaseDate,
// ...
Вы можете прочитать больше о документации@JsonFormat
по Jackson API .
После внесения этого изменения и компиляции приложения запросы с форматом даты «21.10.2016» теперь могут выполняться успешно!
Примечание: Первоначально опубликовано на code.scottshipp.com .
от: https://dev.to//scottshipp/customize-how-jackson-does-localdate-parsing-2hc5