Поскольку skip
имеет тип массив , LocalDateSerializer
, LocalDateDeserializer
и JsonFormat
не работают "из коробки" - они реализованы так, чтобы ожидать токены прямого значения, а не массивы.
Вы можете реализовать свой собственный сериализатор / десериализатор.Наивный десериализатор, который я реализовал для десериализации вашего примера, выглядит следующим образом:
public class CustomLocalDateArrayDeserializer extends JsonDeserializer<LocalDate[]> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
@Override
public LocalDate[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
ArrayList<LocalDate> list = new ArrayList<>();
JsonToken currentToken = p.getCurrentToken();
if (currentToken != JsonToken.START_ARRAY) {
throw new JsonMappingException(p, "Not an array!");
}
currentToken = p.nextToken();
while (currentToken != JsonToken.END_ARRAY) {
if (currentToken != JsonToken.VALUE_STRING) {
throw new JsonMappingException(p, "Not a string element!");
}
LocalDate localDate = LocalDate.parse(p.getValueAsString(), formatter);
list.add(localDate);
currentToken = p.nextToken();
}
return list.toArray(new LocalDate[0]);
}
}
И я изменил аннотацию поля на @JsonDeserialize(using = CustomLocalDateArrayDeserializer.class)
.
Вы можете работать над этим, чтобы повторять и улучшатьсделайте так, чтобы он прочитал и уважал аннотацию @JsonFormat
и так далее, если вы считаете, что это стоит затраченных усилий.