2012-10-02 9 views
22

Voglio deserializzare un oggetto JSON con Jackson. Poiché l'obiettivo è un'interfaccia, è necessario specificare quale implementazione deve essere utilizzata.Jackson - Come specificare una singola implementazione per la deserializzazione referenziata all'interfaccia?

Queste informazioni possono essere archiviate nell'oggetto JSON, utilizzando @ JsonTypeInfo-Annotation. Ma voglio specificare l'implementazione nel codice sorgente perché è sempre la stessa.

È possibile?

+0

La domanda qui riguarda una singola implementazione, ma è possibile effettuare una ricerca sull'ereditarietà in generale e dovremmo quindi vedere l'annotazione @JsonTypeInfo. esempio https://stackoverflow.com/questions/28089484/deserialization-with-jsonsubtypes-for-no-value-missing-property-error/31016173#31016173 – pdem

risposta

22

Utilizzare 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

Grazie, ho appena trovato un'alternativa se si desidera specificare l'implementazione concreta come annotazione http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Abstract_types –

+0

Sembra un buon compromesso! –

+1

@David Grant Dove dovremmo inserire SimpleAbstractTypeResolver nel nostro codice, sto usando l'avvio a molla. –

10

C'è un altro approccio che funziona se si dispone di implementazione dell'interfaccia solo singolo.

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

Questa domanda è stato risposto qualche tempo fa ma voglio darvi un'altra opzione che non richiede di sintonizzarsi ObjectMapper e anche molto più semplice allora @JsonTypeInfo annotazione.

+0

Questa è di gran lunga la migliore risposta alla domanda OP. –

+0

Cosa succede se ho 2 Implementazione e voglio deserializzare in base ad un campo tipo – Gaurav

+0

@Gaurav questa risposta dovrebbe aiutarti: https://stackoverflow.com/questions/27506241/parse-to-a-subclass-by-default- con-jackson/27521288 # 27521288 –

3

È possibile utilizzare @JsonDeserialize(as = ImplementationClass.class) anche sull'interfaccia e tutti i riferimenti verranno deserializzati allo stesso modo.

Nota: se una delle classi di implementazione è un enumerazione, potrebbe essere necessario anche @JsonFormat(shape = JsonFormat.Shape.OBJECT) sull'enumerazione.

Problemi correlati