2011-11-21 5 views
6

मैंने पीओजेओ से JSON में कनवर्ट करने के लिए सर्वर पक्ष पर जैक्सन का व्यापक रूप से उपयोग किया है और यह सोच रहा था कि उद्देश्य सी/आईफोन एसडीके और इसके विपरीत के लिए एक समान पुस्तकालय है या नहीं। उद्देश्य सी प्रतिबिंब प्रदान करता है इसलिए जैक्सन के समान कुछ करना संभव होना चाहिए।आईफोन के लिए जैक्सन समकक्ष?

+0

बस स्पष्ट होने के बाद यहां एक भाषा बाधा हो सकती है; आप अपने घोषित गुणों के आधार पर स्वचालित रूप से जेएसओएन में ऑब्जेक्ट्स को क्रमबद्ध करने के लिए कोड चाहते हैं? – Tommy

+0

हां, आसपास का दूसरा तरीका भी उपयोगी होगा क्योंकि हमारा सर्वर JSON एन्कोडेड प्रतिक्रिया भेजता है। –

उत्तर

4

आप GoldenFleece को आजमा सकते हैं, जो कि Jackson से प्रेरित एक सम्मेलन-ओवर-कॉन्फ़िगरेशन पैटर्न का उपयोग कर JSON और Objective-C ऑब्जेक्ट्स के बीच परिवर्तित हो सकता है।

+0

यह मेरे लिए बहुत देर हो चुकी है और मुझे आत्म-प्रचार दिखाई देता है लेकिन मैं इस पुस्तकालय को लिखने के आपके प्रयास की सराहना करता हूं। कला की वर्तमान स्थिति दर्दनाक थी। –

2

new iOS 5 APIs JSON पढ़ने/लिखने में एक महान सुविधा प्रदान करता है। ये अनिवार्य रूप से TouchJSON library का एक रिहाश है जिसका उपयोग आप आईओएस 4 में कर सकते हैं। जबकि मैंने वहां बहुत कुछ नहीं देखा है जो पीओसीओ ऑब्जेक्ट्स को उदाहरण पेलोड से उत्पन्न करेगा, आप कक्षाएं बना सकते हैं जो कि NSDictionary उदाहरण के लिए सिर्फ एक मुखौटा है कि उपरोक्त पुस्तकालय वापस आ जाएंगे।

उदाहरण के लिए:

@interface PBPhoto : NSObject { 
    NSDictionary* data_; 
} 

@property (nonatomic, retain, readonly) NSDictionary *data; 

- (NSString*) photoId; 
- (NSString*) userId; 
- (NSString*) user; 
- (NSString*) title; 
- (id) initWithData:(NSDictionary*)data; 


@end 

कार्यान्वयन:

#import "PBPhoto.h" 

#define PHOTO_ID @"id" 
#define USER_ID @"user_id" 
#define USER @"user" 
#define TITLE @"title" 

@implementation PBPhoto 
@synthesize data = data_; 

- (id) initWithData:(NSDictionary*)data { 
    if ((self = [super init])) { 
     self.data = data; 
    } 

    return self; 
} 

- (NSString*) photoId { 
    return [super.data objectForKey:PHOTO_ID]; 
} 

- (NSString*) userId { 
    return [self.data objectForKey:USER_ID]; 
} 

- (NSString*) user { 
    return [self.data objectForKey:USER]; 
} 

- (NSString*) title { 
    return [self.data objectForKey:TITLE]; 
} 

- (void) dealloc { 
    [data_ release]; 
    [super dealloc]; 
} 

@end 
+1

यह उपयोगी होगा कि हर वर्ग की हर संपत्ति के लिए गेटर्स को लागू न करें। यही वह जगह है जहां प्रतिबिंब उपयोगी हो सकता है। –

1

ऑब्जेक्टिव-सी प्रतिबिंब साल के ख़ामोश हो सकता है प्रदान करता है, लेकिन सामान का एक बहुत ही निम्न स्तर से सामने आ रहा है यही कारण है कि सी रनटाइम और इसलिए थोड़ा उलझन है।

मान लें कि आप एक मनमाना वस्तु लेने के लिए और यह JSON में बदलने के लिए चाहते हैं, शायद स्मार्ट बात एक मध्यस्थ के रूप में एक NSDictionary बनाने के लिए है, तो यह (अपने आप को NSJSONSerialization के पास या फिर तीसरे पक्ष के सभी क्योंकि स्ट्रिंग का निर्माण है deserialise करने में सक्षम होने के बोझ के कारण पुस्तकालय काफी भारी वजन है)।

तो, उदाहरण के लिए:

- (NSDictionary *)dictionaryOfPropertiesForObject:(id)object 
{ 
    // somewhere to store the results 
    NSMutableDictionary *result = [NSMutableDictionary dictionary]; 

    // we'll grab properties for this class and every superclass 
    // other than NSObject 
    Class classOfObject = [object class]; 
    while(![classOfObject isEqual:[NSObject class]]) 
    { 
     // ask the runtime to give us a C array of the properties defined 
     // for this class (which doesn't include those for the superclass) 
     unsigned int numberOfProperties; 
     objc_property_t *properties = 
        class_copyPropertyList(classOfObject, &numberOfProperties); 

     // go through each property in turn... 
     for(
       int propertyNumber = 0; 
       propertyNumber < numberOfProperties; 
       propertyNumber++) 
     { 
      // get the name and convert it to an NSString 
      NSString *nameOfProperty = [NSString stringWithUTF8String: 
            property_getName(properties[propertyNumber])]; 

      // use key-value coding to get the property value 
      id propertyValue = [object valueForKey:nameOfProperty]; 

      // add the value to the dictionary — 
      // we'll want to transmit NULLs, even though an NSDictionary 
      // can't store nils 
      [result 
        setObject:propertyValue ? propertyValue : [NSNull null] 
        forKey:nameOfProperty]; 
     } 

     // we took a copy of the property list, so... 
     free(properties); 

     // we'll want to consider the superclass too 
     classOfObject = [classOfObject superclass]; 
    } 

    // return the dictionary 
    return result; 
} 

तो फिर तुम + dataWithJSONObject:options:error:NSJSONSerialization पर लौट आए शब्दकोश के साथ उपयोग कर सकते हैं।

अन्य रास्ता तय करने के लिए, मुझे लगता है कि आप setValue:forKey: कोडिंग विधि, allKeys और valueForKey: के माध्यम से एक शब्दकोश से कुंजी और मूल्यों हो रही कुंजी-मान का उपयोग करेंगे।

+0

धन्यवाद, हाँ यह वही है जो मुझे दिमाग में था लेकिन उम्मीद थी कि किसी ने मेरे लिए कड़ी मेहनत की है। मुझे लगता है कि मैं आपके उदाहरण का आधार के रूप में उपयोग करूंगा और खुद को कुछ हद तक चाबुक कर दूंगा –