2012-10-02 7 views
22

Bir JSON Nesnesini Jackson ile kaldırmak istiyorum. Hedef bir arayüz olduğu için hangi uygulamanın kullanılacağını belirtmem gerekiyor.Jackson - Arabirim referanslı serileştirme için tek bir uygulama nasıl belirtilir?

Bu bilgi JSON Nesnesinde @ JsonTypeInfo-Annotation kullanılarak saklanabilir. Ancak, kaynak koddaki uygulamayı belirtmek istiyorum çünkü her zaman aynıdır.

Bu mümkün mü?

+0

Burada soru tek bir uygulama hakkındadır, ancak genel olarak kalıtım hakkında bir araştırma yapabilir ve daha sonra @JsonTypeInfo ek açıklamalarını görmeliyiz. örnek https://stackoverflow.com/questions/28089484/deserialization-with-jsonsubtypes-for-no-value-missing-property-error/31016173#31016173 – pdem

cevap

22

kullanın 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

Teşekkürler, somut uygulamayı belirtmek istiyorsanız bir alternatif buldum. bir açıklama olarak http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Abstract_types –

+0

Güzel bir uzlaşma gibi geliyor! –

+1

@David Grant Kodumuzda SimpleAbstractTypeResolver'ı nereye yerleştirmeliyiz, ben ilkbahar açılışını kullanıyorum. –

10

sadece tek bir arayüz uygulaması varsa çalışacaktır başka bir yaklaşım vardır.

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

Bu soru bir süre önce cevap ama sana ayar ObjectMapper ve @JsonTypeInfo açıklama daha sonra da daha basit gerektirmez bir seçenek sunmak istiyorum edilmiştir.

+0

Bu, OP sorununun en iyi cevabıdır. –

+0

Ne 2 Uygulama var ve bu cevap size yardımcı olacaktır @Gaurav bazı tip alanında – Gaurav

+0

dayalı serisini istiyorsanız: https://stackoverflow.com/questions/27506241/parse-to-a-subclass-by-default- ile-jackson/27521288 # 27521288 –

3

Siz de arabirimde @JsonDeserialize(as = ImplementationClass.class) kullanabilir ve tüm referanslar aynı şekilde serileştirilemezse edilecektir. senin Uygulama sınıflarının biri bir enum ise

Not siz de enum üzerinde @JsonFormat(shape = JsonFormat.Shape.OBJECT) gerekebilir.