Я советую вам по возможности использовать стандарт ISO 8601 , который одобрен RFC 3339 , а также xkcd 1179 :)
Если такой стандарт не подходит для вашего приложения, вы можете создать свой собственный десериализатор, в котором вы указываете свой собственный DateTimeFormatter
с ResolverStyle
, который может быть LENIENT
, SMART
или STRICT
:
public class CustomLocalDateDeserializer extends JsonDeserializer<LocalDate> {
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyMMdd")
.parseDefaulting(ChronoField.ERA, 1)
.toFormatter()
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(ResolverStyle.STRICT); // Also can be LENIENT or SMART
@Override
public LocalDate deserialize(JsonParser p,
DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
return LocalDate.parse(value, FORMATTER);
}
}
А затем используйте его следующим образом:
public class Foo {
@JsonDeserialize(using = CustomLocalDateDeserializer.class)
private LocalDate date;
// Getters and setters
}
String json = "{\"date\":\"180231\"}";
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(json, Foo.class);
Рассмотрим yyMMdd
в качестве формата даты и 180231
в качестве ввода. У вас будут разные результаты в соответствии с ResolverStyle
:
LENIENT
: значение date
будет 2018-03-03
.
SMART
: значение date
будет 2018-02-28
.
STRICT
: будет сгенерировано исключение: Invalid date 'FEBRUARY 31'
.