2011-02-11 7 views
6

मैं जेएसओएन जानकारी को विभिन्न वस्तुओं में गतिशील रूप से मैप करने की कोशिश कर रहा हूं। लेकिन मैं समझ नहीं पा रहा हूं कि पूरी सूचक स्थिति को नियंत्रण में कैसे प्राप्त किया जाए, जैसा कि मैं उम्मीद कर रहा था कि काम नहीं करेगा।उद्देश्य-सी DRY JSON मैपिंग और ऑब्जेक्ट क्रिएशन

अब तक मेरी कार्यप्रणाली प्रत्येक वस्तु के लिए एक शब्दकोश बनाने के लिए, बराबर JSON चाबियाँ करने के लिए चर संकेत दिए गए मानचित्रण किया गया है। मेरे JSON मैपर में, मेरे पास एक विधि है, parseJSONFromDictionary:withObject जिसे SBJSON के JSONValue द्वारा वापस किए गए शब्दकोश पर फिर से शुरू किया जाना चाहिए और दिए गए ऑब्जेक्ट में उचित चर के लिए उपयुक्त मान असाइन करें।

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start{ 
    for (NSString *key in dict) { 
     if ([[self.mappings objectForKey:key] isMemberOfClass:[NSString class]]) { 
      start.[self.mappings objectForKey:key] = [[dict valueForKey:key] stringValue]; 
     } 
    } 
    return start; 
}

mappings शब्दकोश चर और json कुंजी है कि है, और dict क्या JSON पार्सर से लौटे हो जाता है।

बड़ी समस्या यह है कि मैं start.[self.mappings objectForKey:key] नहीं कर सकते। मुझे सी के बारे में बहुत कुछ पता नहीं है, और स्पष्ट रूप से मुझे पॉइंटर्स के बारे में पर्याप्त जानकारी नहीं है, तो मैं इस तरह की प्रणाली बनाने के बारे में कैसे जाऊं? मुझे पता है कि ऐसा करने का सही तरीका नहीं है, लेकिन सही तरीका क्या है? मुझे पता है कि यह किया जा सकता है, क्योंकि RestKit ऐसा करता है, लेकिन वे ओएथ का समर्थन नहीं करते हैं इसलिए मैं दुख की बात अपने सुंदर ढांचे का उपयोग नहीं कर सकता।

कारण मैं इस मार्ग जा रहा हूँ क्योंकि एपीआई के साथ मैं काम कर रहा हूँ अपने अल्फा चरण में है है। मैं कोड की कई पंक्तियों को फिर से लिखने के बिना किसी भी भावी बदलावों को आसानी से अनुकूलित करने में सक्षम होना चाहता हूं। मैं भी DRY-ly प्रोग्रामिंग शुरू करना चाहता हूं। मुझे पता है कि जेएसओएन पार्सिंग बहुत दोहराया गया है, और मैं ओवरहेड की मात्रा को कम करने का एक तरीका ढूंढना चाहता हूं।

किसी भी और सभी मदद के लिए धन्यवाद!


संपादित करें: ऐसा लगता है कि मैं क्या पूछ रहा हूँ के रूप में कुछ भ्रम की स्थिति नहीं है। I JSON को पार्स करने में सहायता चाहिए। मैं पहले से ही SBJSON का उपयोग कर रहा हूं। I को अनुरोध करने में सहायता की आवश्यकता नहीं है, मैं पहले से ही JDG's OAuthConsumer framework का उपयोग कर रहा हूं। I केवल OAuth 2.0 का समर्थन करने वाले ढांचे का उपयोग कर सकते हैं।

मैं पता लगाना कैसे इसे रोकने मदद की जरूरत है:

-(Class1 *)parseJsonForClass1:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class1 *instance1 = [self mapObjectsForClass1From:outputDict]; 
    return instance1; 
} 

-(Class2 *)parseJsonForClass2:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class2 *instance2 = [self mapObjectsForClass2From:outputDict]; 
    return instance2; 
} 

-(Class3 *)parseJsonForClass3:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class2 *instance3 = [self mapObjectsForClass3From:outputDict]; 
    return instance3; 
} 

-(Class1 *)mapObjectsForClass1From:(NSDictionary *)dict { 
    Class1 *object1 = [[Class1 alloc] init]; 
    object1.name = [[dict valueForKey:@"name"] stringValue]; 
    object1.date = [[dict valueForKey:@"date"] stringValue]; 
    object1.objId = [[dict valueForKey:@"id"] intValue]; 

    return object1; 
} 

-(Class2 *)mapObjectsForClass2From:(NSDictionary *)dict { 
    Class2 *object2 = [[Class2 alloc] init]; 
    object2.something = [[dict valueForKey:@"something"] stringValue]; 
    object2.title = [[dict valueForKey:@"title"] stringValue]; 
    object2.imageUrl = [[dict valueForKey:@"image_url"] stringValue]; 

    return object2; 
} 

-(Class3 *)mapObjectsForClass3From:(NSDictionary *)dict { 
    Class3 *object3 = [[Class3 alloc] init]; 
    object3.foo = [[dict valueForKey:@"bar"] stringValue]; 
    object3.flag = [[dict valueForKey:@"is_member"] boolValue]; 
    object3.obj1 = [[Class1 alloc] init]; 
    object3.obj1 = [self mapOjectsForClass1From:[dict objectForKey:@"name1"]]; 

    return object3; 
}

तो मुझे बताएं कि आप कैसे 1 विधि में तरीकों में से इन प्रकार के गठबंधन करने के लिए पर कोई सुझाव हैं तो कृपया ...

+0

क्या आपने https://github.com/RestKit/RestKit पर देखा है? – Brenden

+0

मैंने रेस्टकिट को देखा था। मुझे यह पसंद नहीं आया कि उसने क्या किया, और मैं अभी भी नहीं करता। मेरे जीवन में कभी भी एक लूप में ऑब्जेक्ट्स को बढ़ाने के लिए मैंने एक और अधिक सही स्मृति आवंटन वक्र देखा है। – MishieMoo

उत्तर

2

मैंने वास्तव में हाल ही में Objective Resources का उपयोग करके ऐसा करने वाला देखा। हालांकि यह वस्तुओं तक पहुंचने का एक अच्छा तरीका है, कुछ कार्यान्वयन गन्दा हो सकता है। और आपको सर्वर को जो कुछ भी भेजता है, उसका उपयोग करना होगा, चाहे आप इसे पसंद करते हों या नहीं। मैं अभी इस से दूर रहना चाहता हूं।

0

इसके अलावा HTTPRiot जो आपके कंधे से संचार के प्रयासों का सबसे का ख्याल रखता है एसिंक्रोनस कनेक्शन संभालती है, आदि iOS के साथ इस Tutorial about JSON communications को देखो (रूबी तुला है, लेकिन कम से कम) से पता चलता है कि यह कैसे उपयोग करने के लिए; कुछ कोड पुराना है, लेकिन कुल मिलाकर संदेश मिलता है।

+0

मैंने JSON काम का एक टन पहले किया है, इसलिए मुझे पता है कि जेएसओएन को ऑब्जेक्ट्स में कैसे पार्स करना है। मैं बस यह पता लगाने की कोशिश कर रहा हूं कि प्रत्येक ऑब्जेक्ट के लिए व्यक्तिगत फ़ंक्शन कैसे नहीं प्राप्त किए जा रहे हैं। इसके अलावा, मुझे OAuth का उपयोग करने की आवश्यकता है, इसलिए मैं HTTPRiot, या किसी भी अन्य ढांचे का उपयोग नहीं कर सकता, जिसमें पहले से ही ओएथ बनाया गया है (नोट: मुझे अभी तक कोई नहीं मिला है) – MishieMoo

+0

फिर मैं दूसरी सिफारिश को दूसरी बार और एसबीजेसन में देखता हूं (उर्फ JSON फ्रेमवर्क)। यह अंतर्निहित OAuth नलसाजी को ढंकने के दौरान जेएसओएन ऑब्जेक्ट मार्शलिंग को सहजता से प्रबंधित करता है। – yuvalz

+0

मैं पहले से ही एसबीजेसन का उपयोग कर रहा हूं। जेएसओएन को पार्सिंग के बाद, ऑब्जेक्ट सृजन के साथ इसे करना होगा, जेएसओएन खुद को पार्स नहीं कर रहा है। – MishieMoo

5

आप केवीसी का उपयोग कर सकते हैं। जेएसओएन डिक्शनरी में प्रत्येक मान के लिए एक सेटटर बनाएं जिसे आप अपनी ऑब्जेक्ट में डालना चाहते हैं और वास्तव में मान सेट करने के लिए -setValue:forKey: का उपयोग करें।

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start 
{ 
    for (NSString *key in [dict allKeys]) 
    { 
     NSString* propertyName = [[self mappings] objectForKey: key]; 
     [start setValue: [dict objectForKey: key] forKey: propertyName]; 
     // the above line will throw an exception if start does not have a set accessor for property 
    } 
    return start; 
} 
+0

यह वही हो सकता है जो मैं ढूंढ रहा हूं! एक बार जब मैं घर पर अपने मैक पर वापस आ जाता हूं तो मैं निश्चित रूप से इसका परीक्षण करूंगा। – MishieMoo

+0

अतिरिक्त सेटर विधि लिखने के बजाय (मैं जितना संभव हो उतना छोटा दोहराव कोड लिखने की कोशिश कर रहा हूं), इस तरह की एक विधि सेटवैल्यू का उपयोग करने के लिए उपयुक्त होगी: forKey http://www.otakunozoku.com/objective-c-class -गुण/ ?? – MishieMoo

+0

इसलिए यह निश्चित रूप से उन पंक्तियों के साथ है जिन्हें मैं ढूंढ रहा हूं। मेरा कार्यान्वयन मुख्य रूप से किसी सरणी में बनाए गए ऑब्जेक्ट्स के संबंध में फ़ंक्शन के भीतर अन्य ऑब्जेक्ट्स बनाने के साथ जारी करने में चल रहा है। कुछ जेएसओएन कॉलों के रिटर्न एरे कहते हैं जिन्हें फिर अलग-अलग ऑब्जेक्ट्स में मैप किया जाना चाहिए ... कहीं भी मुझे इंगित करने के लिए? – MishieMoo

6

मुझे पता है कि यह एक पुराना धागा है, लेकिन इसे यहां रखने के लिए सोचा गया, https://github.com/mystcolor/JTObjectMapping में कोड ऑब्जेक्ट मैपिंग में सहायता करने में सक्षम होगा। इसका उपयोग करने से पहले आप मैपिंग और अपनी कस्टम ऑब्जेक्ट तैयार करना चाहेंगे। मुझे यह गुगलिंग पर मिला .... हालांकि इसे इस्तेमाल किया गया है। इसे आजमाने की जरूरत है।

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