Biblioteca Jackson JSON: como instanciar uma class que contém campos abstratos

Eu quero converter uma string JSON em object java, mas a class desse object contém campos abstratos, que Jackson não pode instanciar e não produz o object. Qual é a maneira mais fácil de informar sobre alguma implementação padrão de uma class abstrata, como

setDefault(AbstractAnimal.class, Cat.class); 

ou para decidir sobre a class de implementação com base no nome do atributo JSON, por exemplo. para object JSON:

 { ... cat: {...} ... } 

Eu apenas iria wite:

 setImpl("cat", Cat.class); 

Eu sei que é possível em Jackson incorporar informações de class dentro do JSON, mas eu não quero complicar o formato JSON que eu uso. Eu quero decidir qual class usar apenas definindo a class de implementação padrão ou pelo nome do atributo (‘cat’) – como na biblioteca XStream, onde você escreve:

 xStream.alias("cat", Cat.class); 

Existe uma maneira de fazer isso, especialmente em uma linha, ou requer mais algum código?

Existem várias maneiras; antes da versão 1.8, a maneira mais simples é provavelmente fazer:

 @JsonDeserialize(as=Cat.class) public abstract class AbstractAnimal { ... } 

quanto a decidir com base no atributo, isso é feito melhor usando @JsonTypeInfo , que faz a @JsonTypeInfo automática (ao gravar) e o uso de informações de tipo.

Existem vários tipos de informações de tipo (nome da class, nome do tipo lógico), bem como mecanismos de inclusão (como-incluído-propriedade, como-wrapper-array, como-wrapper-object). Esta página: https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization explica alguns dos conceitos.

Uma resposta completa com um exemplo muito claro pode ser encontrada aqui: https://stackoverflow.com/a/30386694/584947

Jackson se refere a isso como desserialização polimórfica.

Definitivamente ajudou-me com o meu problema. Eu tinha uma class abstrata que eu estava salvando em um database e precisava unmarshal-lo para uma instância concreta de uma class (compreensivelmente).

Ele irá mostrar-lhe como anotar corretamente a class abstrata pai e como ensinar jackson como escolher entre os candidatos de subclass disponíveis em tempo de execução quando desempacotar.

o problema pode resolver com a anotação @JsonDeserialize na class abstrata refere-se a Jackson Exceptions Problems and Solutions https://www.baeldung.com/jackson-exception