How do I parse JSON with Objective-C?

145,953

Solution 1

With the perspective of the OS X v10.7 and iOS 5 launches, probably the first thing to recommend now is NSJSONSerialization, Apple's supplied JSON parser. Use third-party options only as a fallback if you find that class unavailable at runtime.

So, for example:

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:...
}

Solution 2

Don't reinvent the wheel. Use json-framework or something similar.

If you do decide to use json-framework, here's how you would parse a JSON string into an 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

Solution 3

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"]);

}

file:

 [
  {
  "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":""
  }
  ]

Solution 4

JSON parsing using 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"]]);
            }
            
          }

     }

You can see the Console output as below :

Firstname - Lastname : Chandra Bhusan - Pandey

Firstname - Lastname : Kalaiyarasan - Balu

Firstname - Lastname : (null) - (null)

Firstname - Lastname : Girija - S

Firstname - Lastname : Girija - S

Firstname - Lastname : (null) - (null)

Solution 5

  1. I recommend and use TouchJSON for parsing JSON.
  2. To answer your comment to Alex. Here's quick code that should allow you to get the fields like activity_details, last_name, etc. from the json dictionary that is returned:

    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"]);
        }
    }
    
Share:
145,953

Related videos on Youtube

bhuvana
Author by

bhuvana

Updated on July 08, 2022

Comments

  • bhuvana
    bhuvana almost 2 years

    I am new to iPhone. Can anyone tell me the steps to follow to parse this data and get the activity details, first name, and last name?

    {
        "#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"
            }
        }
    }
    
    • radu florescu
      radu florescu over 10 years
      Make sure you mark an answer as accepted if it helped your cause.
  • Admin
    Admin about 13 years
    As for ‘something similar’, json.org lists five JSON parsers for Objective-C.
  • Robert Karl
    Robert Karl about 11 years
    Any example of how this works you can post? I'm finding the Apple documentation lacking.
  • Tommy
    Tommy about 11 years
    @RobertKarl I've updated my answer; hopefully that clarifies things?
  • Robert Karl
    Robert Karl about 11 years
    Yes! Thank you, that's helpful. In particular, what to pass for options and the error parameter are somewhat mystical without a working example (I haven't found one in their documentation). Why the developer passes a reference to the error pointer remains enigmatic to me.
  • Tommy
    Tommy about 11 years
    @RobertKarl it's just an easy way of having a method that returns two things instead of one; it also usually means that the second one is optional — for most methods with that pattern, supplying nil is valid and simply results in you not getting that information.
  • Ravindranath Akila
    Ravindranath Akila almost 11 years
    Note that its' license is not a standard Open Source license. You might have to review it before using the library.
  • Alex
    Alex over 10 years
    Yeah I'm so happy Apple finally added NSJSONSerialization. I use this now instead of json-framework.
  • kiranpradeep
    kiranpradeep almost 10 years
    Does using this really provide any advantage over NSJSONSerialization ?
  • haifacarina
    haifacarina over 9 years
    Worked for me! Thank you so much!
  • Gank
    Gank over 9 years
    Why build error: No visible @interface for 'SBJson4Parser' declares the selector 'objectWithString:'
  • TheM00s3
    TheM00s3 about 9 years
    This is really among the worst advice to give. Its important to learn and understand about how things work rather than just use a framework every time you hit something complex, because that doesn't teach. 3rd party frameworks are not silver bullets either and can be riddled with bugs, inefficiencies, or just suck. Saying that you should use a framework and not worry about it is the worst advice to give since what you are really saying is "Don't learn, just use a framework and save time".