Je vous conseille d'utiliser le standard ISO 8601 chaque fois que possible, qui est soutenu par le RFC 3339 et également par le xkcd 1179 :)
Si un tel standard n'est pas une option pour votre application, vous pouvez créer votre propre désérialiseur, où vous spécifiez votre propre DateTimeFormatter
avec un ResolverStyle
qui peut être LENIENT
, SMART
ou STRICT
:
public class CustomLocalDateDeserializer extends JsonDeserializer {
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);
}
}
Et ensuite l'utiliser comme suit:
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);
Considérez yyMMdd
comme le format de date et 180231
comme l'entrée. Vous aurez des résultats différents selon le ResolverStyle
:
LENIENT
: La valeur de date
sera 2018-03-03
.
SMART
: La valeur de date
sera 2018-02-28
.
STRICT
: Une exception sera levée: Date invalide 'FEBRUARY 31'
.