Мне интересно, как настроить Джексона для десериализации сериализованного списка объектов, которые содержались в «специальных» коллекциях (неизменяемых или в результате собранного потока).
Вот моя проблема, по определенным причинамМне нужно объявить де-печатание в Джексоне, потому что я должен быть в состоянии десериализовать все и вернуть все мои типы.
public static class Sink {
private List items;
public Sink setItems(final List items) {
this.items = items;
return this;
}
public List getItems() {
return this.items;
}
}
public static void main(String[] args) throws Exception {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.registerModule(new Jdk8Module());
mapper.registerModule(new AfterburnerModule());
mapper.enableDefaultTyping(NON_FINAL, JsonTypeInfo.As.PROPERTY);
String content = mapper.writeValueAsString(new Sink().setItems(List.of()));
System.out.println(content);
Sink result = mapper.readValue(content, Sink.class);
}
Но это имеет неприятный побочный эффект с коллекциями. Значение content
:
{
"@class": "api.Sink",
"items": ["java.util.ImmutableCollections$ListN", []]
}
И, к сожалению, java.util.ImmutableCollections.*
не имеет конструкторов по умолчанию (что имеет смысл).
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
java.util.ImmutableCollections $ ListN(no Creators, like default construct, exist): no default no-arguments constructor found
Мне интересно, как заставить Джексона десериализовать объект такого типа как ArrayList
или любой другой тип списка.
Я бы хотел настроить его для десериализации всех подтиповсписка как ArrayList
/ LinkedList
или при сериализации для изменения типа коллекции
(java 12 / jackson 2.9.7)