2013-06-28 11 views
5

का उपयोग करके lazylist deserialize मेरे पास एक ऑब्जेक्ट है जो org.apache.commons.collections.list.LazyList का उपयोग अपने क्षेत्र में से एक के लिए करता है, जो टीआई JSON क्रमबद्ध है। JSON इस तरह दिखता है:जैक्सन

 "myObject": ["org.apache.commons.collections.list.LazyList", [ 
      { 
       "attr1": "asdasd", 
       "attr2": 1234 
      } 
     ]], 

वस्तु क्षेत्र इस तरह दिखता है:,

List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory) 

हालांकि एक जैक्सन ObjectMapper विफल रहता है का उपयोग करके उपरोक्त JSON deserialize की कोशिश कर रहा है, क्योंकि यह के लिए एक डिफ़ॉल्ट निर्माता नहीं मिल सकता है एक आलसी सूची - जो समझ में आता है। लेकिन मैं कैसे निर्दिष्ट कर सकता हूं कि इस क्षेत्र को कैसे deserialized किया जा सकता है?

त्रुटि संदेश:

[संग्रह प्रकार के लिए कोई डिफ़ॉल्ट निर्माता;

इनाम इकट्ठा करने के लिए, इस सवाल की जरूरत है: वर्ग org.apache.commons.collections.list.LazyList, [सरल प्रकार, वर्ग foo.bar.MyObject]]

बाउंटी-बाधाओं शामिल एक कस्टम जैक्सन deserializer का उपयोग कर जवाब दिया जाना चाहिए - कस्टम deserializer फ़ील्ड विशिष्ट नहीं होना चाहिए! इसलिए किसी विशिष्ट प्रकार के लिए LazyList के कस्टम कार्यान्वयन का उपयोग करने का कोई समाधान इस प्रश्न का पर्याप्त उत्तर नहीं देगा।

+0

आपको प्रश्न के लिए बाउंटी टेक्स्ट शामिल करना चाहिए, क्योंकि यह उचित रूप से इसका उत्तर देने के लिए प्रासंगिक है। –

+0

इस 100% सब कुछ के साथ संगत बनाने का कोई तरीका नहीं है। चूंकि डेटा खो गया है, इसलिए आपको LazyList की बैकिंग सूची कार्यान्वयन और फैक्ट्री जैसी धारणाएं अवश्य करनी होंगी। उन धारणाओं के बिना ऐसा करने का एकमात्र तरीका यह जानकारी किसी भी तरह से क्रमबद्ध JSON को जोड़ना है। आप उस जानकारी को जोड़ने के लिए प्रतिबिंब का उपयोग करने के लिए अपना स्वयं का सीरियलाइज़र लिख सकते हैं, और उस जानकारी का उपयोग करने के लिए deserializer (फिर से, प्रतिबिंब का उपयोग करके) LazyList ऑब्जेक्ट बनाते हैं, लेकिन आप अभी भी धारणाएं बना रहे हैं, जैसे कि आपके कारखानों में 0-Arg रचनाकार हैं। –

+0

"जावा प्रतिबिंब" के लिए एक Google खोज करें और अपने सीरिएलाइज़र के लिए संरक्षित 'संग्रह' और' फैक्ट्री' चर प्राप्त करने के लिए और अपने deserializer के लिए रचनाकारों का उपयोग करें। या सहायता के लिए अन्य प्रश्न देखें, जैसे: http://stackoverflow.com/questions/735230/java-reflection –

उत्तर

1

नीचे दिया गया समाधान सूची और मानचित्र संग्रह वस्तुओं दोनों पर काम करता है, यह आपके लिए भी काम कर सकता है।

@JsonDeserialize(contentAs=MyObject.class) 
private List<MyObject> myObject = ListUtils.lazyList(new ArrayList(), {new MyObject()} as Factory);