मैं JSON को ऑब्जेक्टिव-सी के साथ कैसे पार करूं?


114

मैं iPhone के लिए नया हूँ। क्या कोई मुझे इस डेटा को पार्स करने और गतिविधि विवरण, पहला नाम और अंतिम नाम प्राप्त करने के लिए अनुसरण करने के लिए कदम बता सकता है?

{
    "#error": false, 
    "#data": {
        "": {
            "activity_id": "35336", 
            "user_id": "1", 
            "user_first_name": "Chandra Bhusan", 
            "user_last_name": "Pandey", 
            "time": "1300870420", 
            "activity_details": "Good\n", 
            "activity_type": "status_update", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-1627435117.jpg"
        }, 
        "boolean": "1", 
        "1": {
            "1": {
                "photo_1_id": "9755"
            }, 
            "activity_id": "35294", 
            "album_name": "Kalai_new_Gallery", 
            "user_id": "31", 
            "album_id": "9754", 
            "user_first_name": "Kalaiyarasan", 
            "user_last_name": "Balu", 
            "0": {
                "photo_0_id": "9756"
            }, 
            "time": "1300365758", 
            "activity_type": "photo_upload", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/"
        }, 
        "3": {
            "activity_id": "35289", 
            "user_id": "33", 
            "user_first_name": "Girija", 
            "user_last_name": "S", 
            "time": "1300279636", 
            "activity_details": "girija Again\n", 
            "activity_type": "status_update", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg"
        }, 
        "2": {
            "owner_first_name": "Girija", 
            "activity_id": "35290", 
            "activity_details": "a:2:{s:4:\"html\";s:51:\"!user_fullname and !friend_fullname are now friends\";s:4:\"type\";s:10:\"friend_add\";}", 
            "activity_type": "friend accept", 
            "owner_last_name": "S", 
            "time": "1300280400", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg", 
            "owner_id": "33"
        }, 
        "4": {
            "activity_id": "35288", 
            "user_id": "33", 
            "user_first_name": "Girija", 
            "user_last_name": "S", 
            "time": "1300279530", 
            "activity_details": "girija from mobile\n", 
            "activity_type": "status_update", 
            "photo_url": "http://184.73.155.44/hcl-meme/QA_TEST/sites/default/files/pictures/picture-33-6361851323080768.jpg"
        }
    }
}

1
सुनिश्चित करें कि आप एक उत्तर के रूप में चिह्नित करते हैं यदि यह आपके कारण से मदद करता है।
राडू फ्लोरसेक्यू

जवाबों:


174

OS X v10.7 और iOS 5 के परिप्रेक्ष्य के साथ, शायद अब सिफारिश करने वाली पहली चीज़ है NSJSONSerialization, Apple की आपूर्ति JSON पार्सर। यदि आप उस समय रनवे पर अनुपलब्ध हैं, तो केवल तृतीय-पक्ष विकल्पों का उपयोग करें।

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

NSData *returnedData = ...JSON data, probably from a web request...

// probably check here that returnedData isn't nil; attempting
// NSJSONSerialization with nil data raises an exception, and who
// knows how your third-party library intends to react?

if(NSClassFromString(@"NSJSONSerialization"))
{
    NSError *error = nil;
    id object = [NSJSONSerialization
                      JSONObjectWithData:returnedData
                      options:0
                      error:&error];

    if(error) { /* JSON was malformed, act appropriately here */ }

    // the originating poster wants to deal with dictionaries;
    // assuming you do too then something like this is the first
    // validation step:
    if([object isKindOfClass:[NSDictionary class]])
    {
        NSDictionary *results = object;
        /* proceed with results as you like; the assignment to
        an explicit NSDictionary * is artificial step to get 
        compile-time checking from here on down (and better autocompletion
        when editing). You could have just made object an NSDictionary *
        in the first place but stylistically you might prefer to keep
        the question of type open until it's confirmed */
    }
    else
    {
        /* there's no guarantee that the outermost object in a JSON
        packet will be a dictionary; if we get here then it wasn't,
        so 'object' shouldn't be treated as an NSDictionary; probably
        you need to report a suitable error condition */
    }
}
else
{
    // the user is using iOS 4; we'll need to use a third-party solution.
    // If you don't intend to support iOS 4 then get rid of this entire
    // conditional and just jump straight to
    // NSError *error = nil;
    // [NSJSONSerialization JSONObjectWithData:...
}

1
यह कैसे काम करता है इसका कोई भी उदाहरण आप पोस्ट कर सकते हैं? मुझे Apple दस्तावेज़ की कमी महसूस हो रही है।
रॉबर्ट कार्ल

@RobertKarl मैंने अपना उत्तर अपडेट कर दिया है; उम्मीद है कि चीजों को स्पष्ट करता है?
टॉमी

हाँ! धन्यवाद, यह मददगार है। विशेष रूप से, विकल्प के लिए क्या पास करना है और त्रुटि पैरामीटर काम के उदाहरण के बिना कुछ रहस्यमय है (मुझे उनके प्रलेखन में एक नहीं मिला है)। क्यों डेवलपर त्रुटि सूचक का संदर्भ देता है, मेरे लिए रहस्यपूर्ण है।
राबर्ट कार्ल

1
@RobertKarl यह एक तरीका है जो एक के बजाय दो चीजों को वापस करने का एक आसान तरीका है; इसका आम तौर पर यह भी अर्थ है कि दूसरा तरीका वैकल्पिक है - उस पद्धति के अधिकांश तरीकों के लिए, शून्य की आपूर्ति करना वैध है और इसके परिणामस्वरूप आपको वह जानकारी नहीं मिल सकती है।
टॉमी

हाँ, मैं बहुत खुश हूँ Apple अंततः जोड़ा NSJSONSerialization। मैं अब इसके बजाय इसका उपयोग करता हूं json-framework
एलेक्स

23

पहिया को सुदृढ़ मत करो। जसन-फ्रेमवर्क या कुछ इसी तरह का उपयोग करें ।

यदि आप json- फ्रेमवर्क का उपयोग करने का निर्णय लेते हैं, तो यहां बताया गया है कि आप JSON स्ट्रिंग a में पार्स कैसे करेंगे NSDictionary:

SBJsonParser* parser = [[[SBJsonParser alloc] init] autorelease];
// assuming jsonString is your JSON string...
NSDictionary* myDict = [parser objectWithString:jsonString];

// now you can grab data out of the dictionary using objectForKey or another dictionary method

3
'कुछ इसी तरह' के लिए, json.org , उद्देश्य-सी के लिए पांच JSON पार्सर्स सूचीबद्ध करता है।

4
ध्यान दें कि इसका 'लाइसेंस मानक ओपन सोर्स लाइसेंस नहीं है। पुस्तकालय का उपयोग करने से पहले आपको इसकी समीक्षा करनी पड़ सकती है।
रवींद्रनाथ अकीला

2
क्या इसका उपयोग करने से वास्तव में कोई लाभ मिलता है NSJSONSerialization?
किरण

त्रुटि क्यों बनाएँ: 'SBJson4Parser' के लिए कोई भी दिखाई देने वाला @interface चयनकर्ता को 'ऑब्जेक्टविथस्ट्रिंग:' घोषित नहीं करता है
Gank

7
यह वास्तव में देने की सबसे बुरी सलाह में से है। इसके बारे में सीखना और समझना महत्वपूर्ण है कि हर बार जब आप किसी जटिल चीज से टकराते हैं तो फ्रेमवर्क का उपयोग करने के बजाय चीजें कैसे काम करती हैं, क्योंकि यह सिखाता नहीं है। तीसरे पक्ष के ढांचे में या तो चांदी की गोलियां नहीं होती हैं और उन्हें बग, अक्षमता या सिर्फ चूसना के रूप में देखा जा सकता है। यह कहना कि आपको एक रूपरेखा का उपयोग करना चाहिए और इसके बारे में चिंता नहीं करनी चाहिए, यह देने के लिए सबसे खराब सलाह है कि आप वास्तव में क्या कह रहे हैं "सीखो मत, बस एक ढांचे का उपयोग करो और समय बचाओ"।
theM00s3

21
NSString* path  = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"json"];

//将文件内容读取到字符串中,注意编码NSUTF8StringEncoding 防止乱码,
NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

//将字符串写到缓冲区。
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSError *jsonError;
id allKeys = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONWritingPrettyPrinted error:&jsonError];


for (int i=0; i<[allKeys count]; i++) {
    NSDictionary *arrayResult = [allKeys objectAtIndex:i];
    NSLog(@"name=%@",[arrayResult objectForKey:@"storyboardName"]);

}

फ़ाइल:

 [
  {
  "ID":1,
  "idSort" : 0,
  "deleted":0,
  "storyboardName" : "MLMember",
  "dispalyTitle" : "76.360779",
  "rightLevel" : "10.010490",
  "showTabBar" : 1,
  "openWeb" : 0,
  "webUrl":""
  },
  {
  "ID":1,
  "idSort" : 0,
  "deleted":0,
  "storyboardName" : "0.00",
  "dispalyTitle" : "76.360779",
  "rightLevel" : "10.010490",
  "showTabBar" : 1,
  "openWeb" : 0,
  "webUrl":""
  }
  ]

12

JSON NSJSONSerialization का उपयोग करके पार्स कर रहा है

   NSString* path  = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
   
    //Here you can take JSON string from your URL ,I am using json file
    NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *jsonError;
    NSArray *jsonDataArray = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError];
  
    NSLog(@"jsonDataArray: %@",jsonDataArray);

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&jsonError];
if(jsonObject !=nil){
   // NSString *errorCode=[NSMutableString stringWithFormat:@"%@",[jsonObject objectForKey:@"response"]];
   
        
        if(![[jsonObject objectForKey:@"#data"] isEqual:@""]){
            
            NSMutableArray *array=[jsonObject objectForKey:@"#data"];
             // NSLog(@"array: %@",array);
            NSLog(@"array: %d",array.count);  
            
            int k = 0;
            for(int z = 0; z<array.count;z++){
                
                NSString *strfd = [NSString stringWithFormat:@"%d",k];
                NSDictionary *dicr = jsonObject[@"#data"][strfd];
                k=k+1;
                // NSLog(@"dicr: %@",dicr);
                 NSLog(@"Firstname - Lastname   : %@ - %@",
                     [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_first_name"]],
                     [NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_last_name"]]);
            }
            
          }

     }

आप नीचे दिए गए कंसोल आउटपुट को देख सकते हैं:

Firstname - Lastname: चंद्र भूषण - पांडे

फ़र्स्टनेम - लास्टनाम: कालियारसन - बालू

Firstname - Lastname: (null) - (null)

पहला नाम - अंतिम नाम: गिरिजा - एस

पहला नाम - अंतिम नाम: गिरिजा - एस

Firstname - Lastname: (null) - (null)


6
  1. मैं JSON को पार्स करने के लिए TouchJSON की सिफारिश और उपयोग करता हूं
  2. एलेक्स को अपनी टिप्पणी का जवाब देने के लिए। यहां त्वरित कोड है, जो आपको दिए गए json शब्दकोश से activity_details, last_name, आदि जैसे फ़ील्ड प्राप्त करने की अनुमति देता है:

    NSDictionary *userinfo=[jsondic valueforKey:@"#data"];
    NSDictionary *user;
    NSInteger i = 0;
    NSString *skey;
    if(userinfo != nil){
        for( i = 0; i < [userinfo count]; i++ ) {
            if(i)
                skey = [NSString stringWithFormat:@"%d",i];
            else
                skey = @"";
    
            user = [userinfo objectForKey:skey];
            NSLog(@"activity_details:%@",[user objectForKey:@"activity_details"]);
            NSLog(@"last_name:%@",[user objectForKey:@"last_name"]);
            NSLog(@"first_name:%@",[user objectForKey:@"first_name"]);
            NSLog(@"photo_url:%@",[user objectForKey:@"photo_url"]);
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.