Parsing nested JSON objects with JSON Framework for Objective-C

I have the following JSON object:

{
"response": {
    "status": 200
},
"messages": [
    {
        "message": {
            "user": "value"
            "pass": "value",
            "url": "value"
         }
 ]
    }

}

  • Setting the zoom level for a MKMapView
  • Making the tab bar scrollable in iphone?
  • swift 3.0 multiple selection with select all cell
  • check enough space on iphone device before downloading files
  • Center UIButton programmatically
  • iPhone - archiving array of custom objects
  • I am using JSON-Framework (also tried JSON Touch) to parse through this and create a dictionary. I want to access the “message” block and pull out the “user”, “pass” and “url” values.

    In Obj-C I have the following code:

    // Create new SBJSON parser object
    SBJSON *parser = [[SBJSON alloc] init];
    
    // Prepare URL request to download statuses from Twitter
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:myURL]]; 
    
    // Perform request and get JSON back as a NSData object
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    
    // Get JSON as a NSString from NSData response
    NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
    
    //Print contents of json-string
    NSArray *statuses = [parser objectWithString:json_string error:nil];
    NSLog(@"Array Contents: %@", [statuses valueForKey:@"messages"]);
    NSLog(@"Array Count: %d", [statuses count]);
    
    
    NSDictionary *results = [json_string JSONValue];
    NSArray *tweets = [[results objectForKey:@"messages"] objectForKey:@"message"];
    
    for (NSDictionary *tweet in tweets)
    {
        NSString *url = [tweet objectForKey:@"url"];
        NSLog(@"url is: %@",url);
    }
    

    I can pull out “messages” and see all of the “message” blocks, but I am unable to parse deeper and pull out the “user”, “pass”, and “url”.

    3 Solutions Collect From Internet About “Parsing nested JSON objects with JSON Framework for Objective-C”

    Solved:

    NSArray *tweets = [[results objectForKey:@"messages"] valueForKey:@"message"];
    
    Array({
    
      0=>Dictionary({
    
          response =  Array({
    
            0=>Dictionary(Status = 200)
    
          })
    
        }),
    
      1=>Dictionary({
    
          messages = Array({
    
            0=> Dictionary({
    
              message = Array({
    
                0=>Dictionary({
    
                  user = value,
    
                  pass=value,
    
                     url=value
    
                })
    
              })
    
            })
    
          })
    
      })
    
    })
    

    So, to access dictionary for user, pass, url,

    nsarray *arr = jsonmainarray;
    
    
    arr = [[[jsonmainarray objectAtIndex: 1] objectforkey:@"messages"] objectatindex: 0];
    
    
    
    nsdictionary *dict = [arr objectatindex: 0];
    
    arr = [dict objectforkey:@"message"];
    
    dict = [arr objectatindex: 0]; // Dictionary with user, pass, url
    

    there is an easier way (in my opinion) to do JSON parsing 🙂

    - (void)loadJSONData:(NSString *)u{
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://expandurl.appspot.com/expand?url=%@", u]];
        NSData *rawJsonData = [NSData dataWithContentsOfURL:url];
    
        CJSONDeserializer *parser = [CJSONDeserializer new];
        NSError *error;
        NSDictionary *jsonDictionary = [parser deserializeAsDictionary:rawJsonData error:&error];
    
        [parser release];
    
        NSArray *array = [jsonDictionary objectForKey:@"urls"]; 
    }
    

    All you have to do is to use JSON touch… like Sheehan Alam mention.

    Say that you got this line of JSON data:

    {
    “end_url” = “http://www.youtube.com”;
    redirects = 0;
    “start_url” = “http://www.youtube.com”;
    status = OK;
    urls = (
    “http://www.youtube.com”
    );
    }

    then in your JSONDictonary the data can be accessed by doing:

    [jsonDictionary objectForKey:@"urls"]; //This will return an Array since URLS is a array
    [jsondictionary objectForKey:@"en_url"]; //this will return an NSString since end_url is a string
    

    Hope this help people as much as it helped me =)

    sincerely yours
    Kristian