2013-10-15 4 views
11

ObjectMapper का readValue(InputStream in, Class<T> valueType) फ़ंक्शन कक्षा की आवश्यकता है। लेकिन अगर मैं कक्षा में आंतरिक रूप से गुजर रहा हूं, तो मैं इसका उपयोग कैसे करूं, डेटा इंटरफेस के रूप में कुछ इंटरफ़ेस है।जैक्सन के objectMapper का उपयोग कर इंटरफ़ेस फ़ील्ड को deserialize कैसे करें?

हालांकि मैं इस अपवाद के पीछे कारण समझ सकता हूं, क्योंकि जैक्सन को उत्तीर्ण वर्ग के आंतरिक इंटरफेस की ठोस कक्षा नहीं मिल रही है, लेकिन मेरा सवाल यह है कि इसे कैसे हल किया जाए? फिर मैं इसे कैसे बेकार कर सकता हूं? वर्ग मैं deserialize करने के लिए कोशिश कर रहा हूँ है:

class BaseMetricImpl<N> implements Metric<N> { 
    protected MetricValueDescriptor descriptor; 
} 

यहाँ MetricValueDescriptor एक इंटरफेस है, इसलिए यह मेरे निम्न त्रुटि देता है: -

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of MetricValueDescriptor, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information 
at [Source: [email protected]; line: 1, column: 2] (through reference chain: SingleValueMetricImpl["descriptor"]) 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:624) 
    at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:115) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375) 
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:308) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2793) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1989) 
+0

क्या आप अपना नमूना कोड अपडेट कर सकते हैं और त्रुटि स्टैकट्रैक को पूरा कर सकते हैं। – vels4j

+0

@ vels4j मैंने छोटे कोड नमूने और अपवाद – Naman

उत्तर

27

जैक्सन जाहिर MetricValueDescriptor वस्तु का निर्माण नहीं कर सकते हैं क्योंकि यह एक इंटरफेस है। जैक्सन को ऑब्जेक्ट बनाने के तरीके के बारे में बताने के लिए आपको अपने जेसन और अपने ऑब्जेक्टमैपर में अतिरिक्त जानकारी की आवश्यकता होगी।

आप जैक्सन बता सकते हैं json अपने आप में एक क्षेत्र के माध्यम से आवश्यक प्रकार की जानकारी, का कहना है कि "type": यहाँ यह करने के लिए एक ही रास्ता है, MVDImpl संभालने एक ठोस वर्ग जो MetricValueDescriptor लागू करता रहा है। ऐसा करने के लिए, आपको अपने इंटरफ़ेस में JsonTypeInfo और JsonSubTypes एनोटेशन का उपयोग करने की आवश्यकता है। उदाहरण के लिए,

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
    @Type(value = MVDImpl.class, name = "mvdimpl") }) 
interface MetricValueDescriptor 
{ 
    ... 
} 

साथ ही आप अपने json में एक "type":"mvdimpl" क्षेत्र जोड़ने की आवश्यकता होगी।

मैं आपको अधिक जानकारी के लिए official doc पर इंगित करने जा रहा था, लेकिन फिर मुझे इस विषय को कवर करने वाला एक उत्कृष्ट ब्लॉग मिला - Deserialize JSON with Jackson। यह इस विषय को काफी व्यापक रूप से और उदाहरणों के साथ कवर करता है। इसलिए यदि आपको अधिक अनुकूलन की आवश्यकता है तो आपको निश्चित रूप से इसे पढ़ना चाहिए।

+2

डालने के लिए प्रश्न संपादित किया है, मुझे एक ही समस्या का सामना करना पड़ रहा है, हालांकि, 'सुपर-क्लास' मेरा नहीं है, इसे संशोधित नहीं किया जा सकता है। उस स्थिति में, हम 'जैक्सन' मानचित्र को सही 'सब-क्लास' पर कैसे दे सकते हैं? – lvarayut

+1

@lvarayut आप गैर-संशोधित कक्षाओं में एनोटेशन जोड़ने के लिए [जैक्सन मिक्सिन एनोटेशन] (http://wiki.fasterxml.com/JacksonMixInAnnotations) का उपयोग कर सकते हैं। – mucaho

+0

एक और तरीका (थोड़ा अधिक शामिल) तथाकथित "डिफ़ॉल्ट टाइपिंग" का उपयोग करना है, जिसे 'ऑब्जेक्टमैपर' के माध्यम से सक्षम किया गया है। यह एनोटेशन के बिना कक्षाओं की श्रेणियों के लिए प्रकार की जानकारी शामिल करने की अनुमति देगा। डिफ़ॉल्ट रूप से "सभी गैर-ठोस प्रकार", "सभी गैर-अंतिम प्रकार" जैसे कुछ विकल्प होते हैं, लेकिन आप अपनी रणनीति भी कार्यान्वित कर सकते हैं। – StaxMan

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