2012-10-02 24 views
22

Quiero deserializar un objeto JSON con Jackson. Debido a que el objetivo es una interfaz, necesito especificar qué implementación se debe usar.Jackson: ¿cómo especificar una implementación única para la deserialización con referencia a la interfaz?

Esta información podría almacenarse en el objeto JSON, utilizando @ JsonTypeInfo-Annotation. Pero quiero especificar la implementación en el código fuente porque siempre es el mismo.

¿Esto es posible?

+0

La pregunta aquí es acerca de una implementación única, pero se podría investigar acerca de la herencia en general, y entonces deberíamos ver la anotación @JsonTypeInfo. ejemplo https://stackoverflow.com/questions/28089484/deserialization-with-jsonsubtypes-for-no-value-missing-property-error/31016173#31016173 – pdem

Respuesta

22

Utilice un SimpleAbstractTypeResolver:

ObjectMapper mapper = new ObjectMapper(); 

SimpleModule module = new SimpleModule("CustomModel", Version.unknownVersion()); 

SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver(); 
resolver.addMapping(Interface.class, Implementation.class); 

module.setAbstractTypes(resolver); 

mapper.registerModule(module); 
+5

Gracias, acabo de encontrar una alternativa si desea especificar la implementación concreta como anotación http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Abstract_types –

+0

¡Parece un buen compromiso! –

+1

@David Grant ¿Dónde deberíamos colocar SimpleAbstractTypeResolver en nuestro código, estoy usando el arranque de primavera? –

10

Hay otro enfoque que va a funcionar si usted tiene la implementación de interfaces simplemente única.

public class ClassYouWantToDeserialize { 
    @JsonDeserialize(as = ImplementationClass.class) 
    private InterfaceClass property; 
... 
} 

Esta pregunta fue respondida hace un tiempo, pero quiero darle otra opción que no requiere de ObjectMapper sintonía y también mucho más simple entonces @JsonTypeInfo anotación.

+0

Esta es la mejor respuesta a la pregunta OP. –

+0

¿Qué sucede si tengo 2 Implementación y deseo deserializar según algún tipo de campo – Gaurav

+0

@Gaurav? Esta respuesta debería ayudarlo: https://stackoverflow.com/questions/27506241/parse-to-a-subclass-by-default- con-jackson/27521288 # 27521288 –

3

También puede usar @JsonDeserialize(as = ImplementationClass.class) en la interfaz y todas las referencias se deserializarán de la misma manera.

Nota, si una de sus clases de implementación es una enumeración, es posible que necesite @JsonFormat(shape = JsonFormat.Shape.OBJECT) en la enumeración también.

Cuestiones relacionadas