2013-04-16 7 views
6

मैं एक ऑब्जेक्ट किए गए JSON संरचना को मुद्रित करने का प्रयास कर रहा हूं जिसे मैं पदानुक्रम में एकाधिक शब्दकोशों में सहेज रहा हूं। मैं NSObject की description विधि के माध्यम से ऐसा करना चाहता हूं ताकि प्रत्येक नेस्टेड डिक्शनरी की वर्णन विधि को इसके मूल्य को भी वापस करने के लिए कहा जाता है।नेस्टेड NSDictionary विवरण एस्केप कैरेक्टर समस्याएं

वांछित परिणाम

 //First Hierarchal Level 
       //Second Hierarchal Level 
         //Third Hierarchal Level 
People = 
(
    { 
     Name = Person 1 
     Gender = Male 
     Addresses = 
     ( 
      { 
       Address Name = Home Address 
       Street = 123 Street St. 
       City = NewCity 
       State = AZ 
       Zip = 12345 
       Country = USA 
      } 
     ) 
     Cars = 
     ( 
      { 
       Make = Ford 
       Model = NewFord 
       Insured Drivers = 
       (
        { 
         Name = Person 1 
        }, 
        { 
         Name = Person 2 
        } 
       ) 
      } 
     ) 
    } 
) 

//NOTE: Sample untested nested structure 

हालांकि, मैं एक मुद्दा है कि प्रत्येक नेस्टेड शब्दकोश के लिए बदले स्ट्रिंग पदानुक्रम कि वापसी स्ट्रिंग के माध्यम से पारित हो जाता है के प्रत्येक स्तर के लिए एक बार भाग गया हो रही है में चल गया है।

वास्तविक परिणाम

People = \n (\n {\n Name = Person 1\\\n Gender = Male\\\n Addresses =\\\n (\\\n {\\\n Address Name = Home Address\\\n Street = 123 Street St.\\\n City = NewCity\\\n State = AZ\\\n Zip = 12345\\\n Country = USA\\\n }\\\n)\\\n Cars = \\\n (\\\n {\\\\\\\n Make = Ford\\\\\\\n Model = NewFord\\\\\\\n Insured Drivers = \\\\\\\n (\\\\\\\n {\\\\\\\\\\\\\n Name = Person 1\\\\\\\\\\\\\n },\\\\\\\\\\\\\n {\\\\\\\\\\\\\n Name = Person 2\\\\\\\\\\\\\n }\\\\\\\n)\\\\\\\n }\\\n) \n }\n) 

मैंने पढ़ा है कि यह कैसे वर्णन वजह से यह किसी syslog उपयोगिता की तरह कुछ का उपयोग कर के लिए इन भागने पात्रों कहते हैं के साथ क्या करना है, फिर भी मेरा मानना ​​है कि कार्यक्षमता है कि मैं इच्छा उपलब्ध है एनएसएआरएआरई इस तरीके के तरीके के बारे में बताता है कि जिस तरह से मैं चाहता हूं। मैंने परिणाम स्ट्रिंग के माध्यम से पुनरावृत्ति करने और बचने वाले पात्रों को पार्स करने का प्रयास किया है, लेकिन अब तक का सबसे अच्छा परिणाम जो मैंने साथ आया है, सभी शब्दकोशों में सभी गुणों की एक गैर-श्रेणीबद्ध सूची है।

बेस्ट प्रयास

People = 
(
{ 
Name = Person 1 
Gender = Male 
Addresses = 
( 
{ 
Address Name = Home Address 
Street = 123 Street St. 
City = NewCity 
State = AZ 
Zip = 12345 
Country = USA 
} 
) 
Cars = 
( 
{ 
Make = Ford 
Model = NewFord 
Insured Drivers = 
(
{ 
Name = Person 1 
}, 
{ 
Name = Person 2 
} 
) 
} 
) 
} 
) 

मैं अगर किसी और को इस समस्या का सामना करना है सोच रहा था और वे इसे कैसे उबरे।

कोई भी और सभी सुझाव आपका स्वागत है। देखने के लिए धन्यवाद।

अद्यतन 1: टिप्पणी में सलाह के अनुसार, मैं निम्नलिखित NSDictionary श्रेणी पद्धति का उपयोग करके मुद्रण के लिए JSON तार करने के लिए अपने वस्तुओं शब्दकोश पार्स करने की कोशिश की है:,

-(NSString*)JSONDescription 
{ 
    NSError *error; 
    NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; 
    NSString* json = nil; 

    if (! jsonData) { 
     NSLog(@"WARNING: NSDictionary JSONDescription encountered error \"%@\"", error); 
    } else { 
     json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    } 

    return json; 
} 

फिर से के प्रत्येक स्तर पर मेरी पदानुक्रम, मैं प्रत्येक description विधि में अपनी शब्दकोश ऑब्जेक्ट की JSONDescription पर कॉल कर रहा हूं। हालांकि, ऐसा नहीं लगता है कि नेस्टेड ऑब्जेक्ट की description विधि कहा जा रहा है। यह निम्न अपवाद उत्पन्न कर रहा है:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Address)' 

उदाहरण कार्यान्वयन

#import "Person.h" 

#define NAME @"Name" 
#define GENDER @"Gender" 
#define ADDRESSES @"Addresses" 
#define CARS @"Cars" 

@implementation Person 

-(NSDictionary*)toDictionary{ 
    return @{ NAME: self.name, 
       GENDER: self.gender, 
       ADDRESSES: self.addresses, 
       CARS: self.cars}; 
} 

-(NSString*)description{ 
    return self.toDictionary.JSONDescription; 
} 

@end 


#import "Address.h" 

#define ADDRESS_NAME @"Address Name" 
#define STREET @"Street" 
#define CITY @"City" 
#define STATE @"State" 
#define ZIP @"Zip" 
#define COUNTRY @"Country" 

@implementation Address 

-(NSDictionary*)toDictionary{ 
    return @{ ADDRESS_NAME: self.addressName, 
       STREET: self.street, 
       CITY: self.city, 
       STATE: self.state, 
       ZIP: self.zip, 
       COUNTRY: self.country}; 
} 

-(NSString*)description{ 
    return self.toDictionary.JSONDescription; 
} 

@end 


#import "Car.h" 

#define MAKE @"Make" 
#define MODEL @"Model" 
#define INSURED_DRIVERS @"Insured Drivers" 

@implementation Car 

-(NSDictionary*)toDictionary{ 
    return @{ MAKE: self.make, 
       MODEL: self.model, 
       INSURED_DRIVERS: self.drivers}; 
} 

-(NSString*)description{ 
    return self.toDictionary.JSONDescription; 
} 

@end 


#import "Driver.h" 

#define NAME @"Name" 

@implementation Car 

-(NSDictionary*)toDictionary{ 
    return @{ NAME: self.name}; 
} 

-(NSString*)description{ 
    return self.toDictionary.JSONDescription; 
} 

@end 
+0

मैं थोड़ा उलझन में है क्योंकि आप कभी कभी दिखाने "कुंजी = मान" (एक शब्दकोश के रूप में) और कभी कभी हूँ।आप आउटपुट में कौन सा चाहते हैं? - और क्या आप अपना कोड दिखा सकते हैं जिसने "सर्वश्रेष्ठ प्रयास" बनाया है? –

+0

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

+0

दुर्भाग्यवश, मेरे पास अब मेरे सर्वोत्तम प्रयास का कोड नहीं है, लेकिन इसमें कुछ अलग-अलग [myDescriptionString stringByReplacingOccurrencesOfString: @ "\\" withString: @ "\"] से अधिक कुछ भी शामिल नहीं है जो जोड़े गए सभी भागने वाले पात्रों को हटा दिया गया था । मैं यह नहीं समझ सका कि इंडेंटेशन में सही तरीके से कैसे जोड़ा जाए। – Krejko

उत्तर

5

निम्न विधि सबसे खूबसूरत नहीं हो सकता है, लेकिन यह वांछित उत्पादन का उत्पादन करने के लिए लगता है:

@interface NSObject (MyPrettyPrint) 
- (NSString *)prettyPrint; 
@end 

// === ADDED CODE FOR CUSTOM OBJECTS (1) === 
@protocol ObjectToDictionary <NSObject> 
-(NSDictionary *)toDictionary; 
@end 
// === END OF ADDED CODE (1) === 

@implementation NSObject (MyPrettyPrint) 

- (NSString *)prettyPrint 
{ 
    BOOL isColl; 
    return [self prettyPrintAtLevel:0 isCollection:&isColl]; 
} 

- (NSString *)prettyPrintAtLevel:(int)level isCollection:(BOOL *)isCollection; 
{ 

// === ADDED CODE FOR CUSTOM OBJECTS (2) === 
    if ([self respondsToSelector:@selector(toDictionary)]) { 
     NSDictionary *dict = [(id <ObjectToDictionary>)self toDictionary]; 
     return [dict prettyPrintAtLevel:level isCollection:isCollection]; 
    } 
// === END OF ADDED CODE (2) === 

    NSString *padding = [@"" stringByPaddingToLength:level withString:@" " startingAtIndex:0]; 
    NSMutableString *desc = [NSMutableString string]; 

    if ([self isKindOfClass:[NSArray class]]) { 
     NSArray *array = (NSArray *)self; 
     NSUInteger cnt = [array count]; 
     [desc appendFormat:@"%@(\n", padding]; 
     for (id elem in array) { 
      BOOL isColl; 
      NSString *s = [elem prettyPrintAtLevel:(level+3) isCollection:&isColl]; 
      if (isColl) { 
       [desc appendFormat:@"%@", s]; 
      } else { 
       [desc appendFormat:@"%@ %@", padding, s]; 
      } 
      if (--cnt > 0) 
       [desc appendString:@","]; 
      [desc appendString:@"\n"]; 
     } 
     [desc appendFormat:@"%@)", padding ]; 
     *isCollection = YES; 

    } else if ([self isKindOfClass:[NSDictionary class]]) { 
     NSDictionary *dict = (NSDictionary *)self; 
     [desc appendFormat:@"%@{\n", padding]; 
     for (id key in dict) { 
      BOOL isColl; 
      id value = dict[key]; 
      NSString *s = [value prettyPrintAtLevel:(level+3) isCollection:&isColl]; 
      if (isColl) { 
       [desc appendFormat:@" %@%@ =\n%@\n", padding, key, s]; 
      } else { 
       [desc appendFormat:@" %@%@ = %@\n", padding, key, s]; 
      } 
     } 
     [desc appendFormat:@"%@}", padding ]; 
     *isCollection = YES; 

    } else { 
     [desc appendFormat:@"%@", self]; 
     *isCollection = NO; 
    } 

    return desc; 
} 

उदाहरण:

NSDictionary *dict = @{@"People": @[ 
    @{ 
     @"Name": @"Person 1", 
     @"Gender": @"Male", 
     @"Addresses": @[ 
      @{ 
       @"Address Name": @"Home Address", 
       @"Street": @"123 Street St.", 
       @"Zip": @12345 
      }, 
     ], 
     @"Cars": @[ 
      @{ 
       @"Make": @"Ford", 
       @"Model": @"NewFord", 
       @"Insured Drivers": @[ 
        @{@"Name": @"Person 1"}, 
        @{@"Name": @"Person 2"}, 
       ] 
      }, 
     ], 
    }, 

]}; 

NSLog(@"People =\n%@", [dict[@"People"] prettyPrint]); 

आउटपुट: ": मूल्य कुंजी" (JSON के रूप में) अपने उदाहरण में

 
People = 
(
    { 
     Name = Person 1 
     Gender = Male 
     Cars = 
     (
     { 
      Model = NewFord 
      Make = Ford 
      Insured Drivers = 
      (
       { 
        Name = Person 1 
       }, 
       { 
        Name = Person 2 
       } 
      ) 
     } 
    ) 
     Addresses = 
     (
     { 
      Zip = 12345 
      Address Name = Home Address 
      Street = 123 Street St. 
     } 
    ) 
    } 
) 
+0

यह मेरे पास वर्तमान में समाधान के बहुत करीब है। हालांकि, जब प्रत्येक ऑब्जेक्ट के साथ मेरे उदाहरण पर लागू होता है तो वर्णन के रूप में खुद का शब्दकोश मूल्य बनाते हैं, प्रत्येक पंक्ति इंडेंटेशन के पहले स्तर पर होती है। यह आउटपुट को मेरे सर्वोत्तम प्रयास के रूप में सूचीबद्ध उत्तर के लगभग समान बनाता है। आपकी प्रतिक्रिया के लिए धन्यवाद, मुझे लगता है कि हम बहुत करीब आ रहे हैं! – Krejko

+0

ऑब्जेक्ट पदानुक्रम की प्रत्येक परत को प्रिंटिंग के लिए स्वयं का एक शब्दकोश प्रस्तुतिकरण बनाने की आवश्यकता है। अन्यथा मेरे JSON से पार्स किया गया डेटा इन ऑब्जेक्ट्स पर गुणों में संग्रहीत है। इस प्रारूप में, वस्तु आसानी से प्रिंट करने योग्य नहीं है। इन वस्तुओं को आसानी से प्रिंट करने योग्य बनाने का मेरा प्रयास इन मानों को एक शब्दकोश में कैशिंग करना और विवरण में शब्दकोश को प्रिंट करना शामिल था। यदि आप ऐसा करने के बेहतर तरीके से अवगत हैं तो कृपया मुझे बताएं। – Krejko

+0

@ क्रेजेको: मैंने पहले नहीं देखा था कि आपके पास कस्टम ऑब्जेक्ट्स 'कार', 'एड्रेस' इत्यादि हैं। मेरी विधि एनएसजेएसओएसरियलाइजेशन से प्राप्त होने वाले पूर्ण शब्दकोश पर लागू होने वाली थी। –

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