polymorphic java json jackson deserialization

polymorphic - jackson json java



Biblioteca Jackson JSON: cómo crear una instancia de una clase que contiene campos abstractos (3)

Quiero convertir una cadena JSON en un objeto java, pero la clase de este objeto contiene campos abstractos, que Jackson no puede instanciar, y no produce el objeto. ¿Cuál es la forma más fácil de informarle sobre alguna implementación predeterminada de una clase abstracta, como

setDefault(AbstractAnimal.class, Cat.class);

o para decidir sobre la clase de implementación basada en el nombre de atributo JSON, por ejemplo. para el objeto JSON:

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

yo sólo wite:

setImpl("cat", Cat.class);


Sé que es posible en Jackson integrar información de clase dentro de JSON, pero no quiero complicar el formato JSON que uso. Quiero decidir qué clase usar solo configurando la clase de implementación predeterminada, o por el nombre del atributo (''cat''), como en la biblioteca XStream, donde escribe:

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

¿Hay alguna forma de hacerlo, especialmente en una línea, o requiere algo más de código?


Hay múltiples maneras; Antes de la versión 1.8, la forma más sencilla es probablemente hacer:

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

En cuanto a la decisión basada en el atributo, es mejor hacerlo utilizando @JsonTypeInfo , que realiza el incrustado automático (al escribir) y el uso de información de tipo.

Hay varios tipos de información de tipo (nombre de clase, nombre de tipo lógico), así como mecanismos de inclusión (propiedad-como-incluida, matriz-envoltura-como, objeto-envoltura-como). Esta página: https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization explica algunos de los conceptos.


Una respuesta completa con un ejemplo muy claro se puede encontrar aquí: https://.com/a/30386694/584947

Jackson se refiere a esto como Deserialización Polimórfica.

Definitivamente me ayudó con mi problema. Tenía una clase abstracta que estaba guardando en una base de datos y necesitaba desarmarla en una instancia concreta de una clase (es comprensible).

Le mostrará cómo anotar correctamente la clase abstracta principal y cómo enseñarle a Jackson cómo elegir entre los candidatos de subclase disponibles en tiempo de ejecución cuando se desata.