2011-04-23 11 views
7

जावा-भूमि में, कुछ उपयोगी पुस्तकालय हैं जो जेसन स्ट्रिंग को मिलान प्रकार की वस्तुओं में परिवर्तित कर देंगे। कोको के लिए मैंने जो जेसन पुस्तकालयों को देखा है, वह केवल नेस्टेड एनएसडीजी और एनएसएआरआरएआरएस बनाते हैं। क्या वहां कोई उपकरण है जो मुझे इच्छित वस्तु प्रकार को पुनर्निर्मित करने का अतिरिक्त कदम उठाएगा?कोको: कस्टम ऑब्जेक्ट्स के लिए जेसन स्ट्रिंग को deserialize (NSDictionary, NSArray नहीं)

तो, उदाहरण के लिए, एक वर्ग "यूनिकॉर्न" कहा जाता है कि अगर मैं कर दिया है, एक संपत्ति "maneColor" के साथ, और मैं json है कि इस तरह दिखता है:

{ 
"maneColor":"silver" 
} 

मैं अपने आप के साथ एक यूनिकॉर्न वस्तु का दृष्टांत कर सकते हैं "मानेकोलर" "चांदी" पर सेट है।

+0

+1 – psy

उत्तर

7

मुझे किसी भी विशिष्ट कार्यान्वयन से अवगत नहीं है, लेकिन कुंजी-मूल्य कोडिंग आपको जो चाहिए वह बहुत करीब ले जाती है: Key Value Coding Guide। मेरे पास केवीसी के साथ streamed json parsing संयोजन के अच्छे परिणाम हुए हैं।

द -सेट वैल्यू: forKey: विधि कस्टम ऑब्जेक्ट्स को सीरियलाइज्ड डेटा को काफी सरल बनाता है। अपने उदाहरण के साथ जारी रखने के लिए, आप सभी आवश्यक एक्सेसर विधियों के साथ एक यूनिकॉर्न क्लास तैयार करेंगे: -setName:/- name, -setManecolor/-manecolor, आदि (आप कुछ अपेक्षित मानों के लिए गुणों का उपयोग करने में सक्षम हो सकते हैं, लेकिन वहां हैं मामलों, जैसा कि मैनकॉलर वैल्यू के साथ, जहां आप रंग नाम स्ट्रिंग से एनएससीओलर या यूआईसीओलर ऑब्जेक्ट में कनवर्ट करने के लिए कस्टम सेटर लिखना चाहते हैं।)

आप अपनी कस्टम ऑब्जेक्ट में दो और विधियां भी जोड़ना चाहेंगे : -setValue: forUndefinedKey: और -valueForUndefinedKey:। ये विधियां हैं जिन्हें कॉल किया जाएगा यदि आपके ऑब्जेक्ट में केवीसी विधियों में पारित कुंजी से मेल खाने वाले कोई एक्सेसर विधियां नहीं हैं। आप यहां अप्रत्याशित या असमर्थित मान प्राप्त कर सकते हैं, और उन्हें स्टोर कर सकते हैं या आवश्यकतानुसार उन्हें अनदेखा कर सकते हैं।

जब आप -setValue भेजते हैं: forKey: यूनिकॉर्न ऑब्जेक्ट में, ढांचा मुख्य पैटर्न से मेल खाने वाले एक्सेसर्स की तलाश करता है। उदाहरण के लिए, यदि कुंजी "मैनकॉलर" है और आप मान सेट कर रहे हैं, तो फ्रेमवर्क यह देखने के लिए जांच करता है कि क्या आपका ऑब्जेक्ट लागू होता है -setManeColor:। यदि ऐसा है, तो यह मूल्य में गुजरने वाली विधि को आमंत्रित करता है; अन्यथा, -setValue: forUndefinedKey: कहा जाता है, और यदि आपका ऑब्जेक्ट इसे कार्यान्वित नहीं करता है, तो एक अपवाद फेंक दिया जाता है।

जब आपके पार्सर के प्रतिनिधि को अधिसूचना प्राप्त होती है कि एक जेसन यूनिकॉर्न ऑब्जेक्ट को पार्स करना शुरू हो गया है, तो यूनिकॉर्न ऑब्जेक्ट को तुरंत चालू करें। forKey: अपने पार्सर आप को पार्स डेटा रिटर्न के रूप में, -setValue का उपयोग अपने ऑब्जेक्ट के लिए डेटा जोड़ने के लिए:

- (void)parserDidBeginParsingDictionary: (SomeParser *)p 
{ 
    self.currentUnicorn = [ Unicorn unicorn ]; 
} 

- (void)parser: (SomeParser *)p didParseString: (NSString *)string 
      forKey: (NSString *)key 
{ 
    [ self.currentUnicorn setValue: string forKey: key ] 
} 

- (void)parserDidFinishParsingDictionary: (SomeParser *)p 
{ 
    [ self.unicorns addObject: self.currentUnicorn ]; 
} 
+0

धन्यवाद अधिक तनाव! यह निश्चित रूप से जो मैं ढूंढ रहा हूं उसके करीब है। – morgancodes

7

उपयोग Jastor - https://github.com/elado/jastor पहले से ही NSDictionary में JSON पार्स और वास्तविक Objective- का एक उदाहरण भर जाता है लेता है सी कक्षा

NSDictionary *parsedJSON = (yajl, JSONKit etc) 
Unicorn *unicorn = [[Unicorn alloc] initWithDictionary:parsedJSON]; 

unicorn.maneColor // "silver" 
+0

एक विकल्प KVCObjectMapping है। https://github.com/tuyennguyencanada/KVCObjectMapping – occulus

0

एप्पल आईओएस 5.0 जो करने के लिए NSJSONSerialization वर्ग कहा, documentation के अनुसार, निम्नलिखित है:

आप फाउंडेशन को JSON कन्वर्ट करने के लिए वस्तुओं NSJSONSerialization वर्ग का उपयोग करें और कन्वर्ट फाउंडेशन JSON करने के लिए वस्तुओं ।

एक वस्तु है कि JSON करने के लिए परिवर्तित किया जा सकता है निम्नलिखित गुण होना चाहिए:

शीर्ष स्तर वस्तु एक NSArray या NSDictionary है। सभी ऑब्जेक्ट एनएसएसटींग, एनएसएनंबर, एनएसएआरएआरई, एनएस डिक्शनरी या एनएसएनयूएल के उदाहरण हैं। सभी शब्दकोश कुंजी एनएसएसटींग के उदाहरण हैं।संख्याएं NaN या अनंत नहीं हैं।

यहां शुरू करने के लिए tutorial और wrapper method है।

+1

ध्यान दें कि 'NSJSONSerialization' केवल फाउंडेशन ऑब्जेक्ट्स के साथ संचालित होता है। मेरा मानना ​​है कि यूनिकॉर्न क्लास फाउंडेशन क्लास नहीं है :) – ULazdins

1

NSObject में से किसी उपवर्ग NSKeyValueCoding प्रोटोकॉल के अनुरूप है के रूप में:

इकसिंगों के लिए
NSDictionary *parsedJSON = //whatever 
id <NSKeyValueCoding> entity = [[CustomNSObjectSubclass alloc] init]; 
[entity setValuesForKeysWithDictionary:parsedJSON]; 
संबंधित मुद्दे