2011-03-30 5 views
24

मैं जेएसओएन स्ट्रिंग को जावा ऑब्जेक्ट में कनवर्ट करना चाहता हूं, लेकिन इस ऑब्जेक्ट की कक्षा में अमूर्त फ़ील्ड हैं, जो जैक्सन तत्काल नहीं कर सकता है, और इसका उत्पादन नहीं करता है वस्तु। क्या सबसे आसान तरीका है एक अमूर्त वर्ग के कुछ डिफ़ॉल्ट कार्यान्वयन के बारे में यह बताने के लिए, की तरहजैक्सन जेएसओएन लाइब्रेरी: एक वर्ग को तत्काल कैसे करें जिसमें अमूर्त फ़ील्ड हैं

setDefault(AbstractAnimal.class, Cat.class); 

या कार्यान्वयन JSON के आधार पर वर्ग के बारे में फैसला करने के लिए विशेषता नाम, उदाहरण के लिए है। JSON ऑब्जेक्ट के लिए:

{ 
    ... 
    cat: {...} 
    ... 
} 

मैं सिर्फ wite होगा:

setImpl("cat", Cat.class); 


मैं जानता हूँ कि JSON अंदर कक्षा की जानकारी एम्बेड करने के लिए जैक्सन में यह संभव है, लेकिन मैं JSON प्रारूप को मुश्किल नहीं करना चाहती मैं उपयोग। मैं तय करने के लिए क्या वर्ग बस डिफ़ॉल्ट कार्यान्वयन वर्ग की स्थापना द्वारा उपयोग करने के लिए, या विशेषता नाम ('बिल्ली') द्वारा चाहते हैं - Xstream पुस्तकालय है, जहां आप लिखते हैं की तरह:

xStream.alias("cat", Cat.class); 

वहाँ ऐसा करने के लिए एक रास्ता है, विशेष रूप से एक पंक्ति में, या इसके लिए कुछ और कोड की आवश्यकता है?

+0

जावा में 'सार क्षेत्र' जैसी कोई चीज़ नहीं है। – EJP

+1

मेरा मतलब था: 'कक्षा सी {पशु पशु; } ' और मैं सी को तत्काल बनाना चाहता हूं, जहां अनियाल अमूर्त है, और मैं इस क्षेत्र में एक बिल्ली रखना चाहता हूं, जो पशु – Marcin

+0

बढ़ाता है इसलिए कोई समस्या नहीं है। अमूर्त प्रकारों के चर के खिलाफ कोई नियम नहीं है। – EJP

उत्तर

36

कई तरीके हैं; संस्करण 1.8 से पहले, सबसे आसान तरीका करने के लिए शायद है:

@JsonDeserialize(as=Cat.class) 
public abstract class AbstractAnimal { ... } 

विशेषता के आधार पर तय करने के लिए के रूप में, कि सबसे अच्छा स्वत: embeddeding (जब लेखन) @JsonTypeInfo का उपयोग किया जाता है, जो करता है और प्रकार की जानकारी का उपयोग है।

कई प्रकार की प्रकार की जानकारी (कक्षा का नाम, तार्किक प्रकार का नाम), साथ ही समावेशन तंत्र (जैसे-संपत्ति-संपत्ति, ए-रैपर-सरणी, ए-रैपर-ऑब्जेक्ट) शामिल हैं। यह पृष्ठ: https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization कुछ अवधारणाओं को बताता है।

+0

पर टिप्पणियां देखें उत्तर के लिए धन्यवाद! @JsonDeserialize मेरी समस्या के लिए आदर्श होगा, क्योंकि इसे JSON में किसी भी प्रकार की जानकारी एम्बेड करने की आवश्यकता नहीं है। हालांकि मैं इसका उपयोग नहीं कर सकता, क्योंकि मैं उन वर्गों को संशोधित नहीं कर सकता जिन्हें मैं तत्काल बनाना चाहता हूं, क्योंकि वे अन्य परियोजनाओं का हिस्सा हैं, और इस कोड को बदलने से अन्य कोड तोड़ सकता है। – Marcin

+4

एनोटेशन भी काफी लचीले हैं, क्योंकि मैं गतिशील रूप से तय नहीं कर सकता कि मैं किस कार्यान्वयन का उपयोग करता हूं। – Marcin

+1

कक्षाओं को संशोधित करना, जैक्सन मिश्रण-एनोटेशन में यही है। लेकिन सही है, यह एनोटेशन केवल उन मामलों के लिए उपयोग किया जाना है जहां केवल एक कार्यान्वयन प्रकार है। जैक्सन 1.8 में सरल अमूर्त प्रकार -> इम्प्ला टाइप मैपिंग्स की अनुमति देने की कार्यक्षमता होगी, जो इसके लायक है। – StaxMan

2

एक बहुत ही स्पष्ट उदाहरण के साथ एक संपूर्ण जवाब यहां पाया जा सकता: https://stackoverflow.com/a/30386694/584947

जैक्सन बहुरूपी Deserialization के रूप में इस का उल्लेख है।

यह निश्चित रूप से मेरी समस्या के साथ मेरी मदद करता है। मेरे पास एक अमूर्त वर्ग था जिसे मैं डेटाबेस में सहेज रहा था और इसे कक्षा (समझदारी से) के ठोस उदाहरण के लिए अनारक्षित करने की आवश्यकता थी।

यह आपको दिखाएगा कि कैसे पैरेंट अमूर्त वर्ग को उचित तरीके से एनोटेट करना है और जैक्सन को कैसे उपलब्ध कराया जाए जब उपलब्ध उप-वर्ग उम्मीदवारों में अनचाहे होने पर रन-टाइम पर कैसे चुना जाए।

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