2012-10-02 10 views
22

मैं जैक्सन के साथ एक JSON-Object deserialize करना चाहता हूँ। चूंकि लक्ष्य एक इंटरफेस है, मुझे यह निर्दिष्ट करने की आवश्यकता है कि कौन सा कार्यान्वयन किया जाना चाहिए।जैक्सन - इंटरफ़ेस-संदर्भित deserialization के लिए एक एकल कार्यान्वयन कैसे निर्दिष्ट करें?

यह जानकारी JSON-Object में @ JsonTypeInfo-Annotation का उपयोग करके संग्रहीत की जा सकती है। लेकिन मैं स्रोत कोड में कार्यान्वयन निर्दिष्ट करना चाहता हूं क्योंकि यह हमेशा वही रहता है।

क्या यह संभव है?

+0

यहां प्रश्न एक ही कार्यान्वयन के बारे में है, लेकिन कोई सामान्य रूप से विरासत के बारे में शोध कर सकता है, और हमें @JsonTypeInfo एनोटेशन देखना चाहिए। उदाहरण https://stackoverflow.com/questions/28089484/deserialization-with-jsonsubtypes-for-no-value-missing-property-error/31016173#31016173 – pdem

उत्तर

22

उपयोग एक 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

धन्यवाद, अगर आप ठोस कार्यान्वयन निर्दिष्ट करना चाहते हैं तो मुझे बस एक विकल्प मिला एक एनोटेशन के रूप में http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Abstract_types –

+0

एक अच्छा समझौता की तरह लगता है! –

+1

@ डेविड ग्रांट हम अपने कोड में SimpleAbstractTypeResolver कहां रखना चाहिए, मैं वसंत बूट का उपयोग कर रहा हूँ। –

10

एक और दृष्टिकोण है कि अगर आप सिर्फ एकल इंटरफेस कार्यान्वयन काम करेंगे नहीं है।

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

यह सवाल कुछ समय पहले उत्तर दिया गया लेकिन मैं आपको एक और विकल्प है कि धुन ObjectMapper और भी बहुत सरल तो @JsonTypeInfo एनोटेशन की आवश्यकता नहीं है देना चाहते हैं।

+0

यह ओपी प्रश्न का सबसे अच्छा जवाब है। –

+0

यदि मेरे पास 2 कार्यान्वयन है और मैं कुछ प्रकार के फ़ील्ड – Gaurav

+0

@ गौराव के आधार पर deserialize करना चाहता हूं तो इस उत्तर में आपकी सहायता करनी चाहिए: https://stackoverflow.com/questions/27506241/parse-to-a-subclass-by-default- साथ-जैक्सन/27521288 # 27521288 –

3

आप इंटरफ़ेस पर @JsonDeserialize(as = ImplementationClass.class) का भी उपयोग कर सकते हैं और सभी संदर्भों को वैसे ही deserialized किया जाएगा।

नोट, यदि आपके कार्यान्वयन कक्षाओं में से एक enum है, तो आपको enum पर @JsonFormat(shape = JsonFormat.Shape.OBJECT) की आवश्यकता हो सकती है।

संबंधित मुद्दे