Help parsing a nested JSON object

I have the following JSON:

{
    "meta": {
        "code": 200
    }, 
    "response": {
        "deals": [
            {
                "id": 32373, 
                "date_added": "2011-01-13 12:12:50", 
                "end_date": "2011-01-14 10:00:00", 
                "active": 1, 
                "discount": {
                    "raw": 71, 
                    "formatted": "71%"
                }, 
                "price": {
                    "raw": "85.00", 
                    "formatted": "$85"
                }, 
                "value": {
                    "raw": "300.00", 
                    "formatted": "$300"
                }, 
                "purchased": 82, 
                "left": null, 
                "title": "$85 For $300 Babyface Facial At Park Avenue MedSpa", 
                "yipit_title": "71% off Babyface Facial", 
                "url": "http://yipit.com/aff/click/?deal=AvwTADtE&key=F374EFbM", 
                "yipit_url": "http://yipit.com/new-york/livingsocial/85-for-300-babyface-facial-at-park-avenue-medspa/", 
                "images": {
                    "image_big": "http://img.ioscake.com/iphone/85-for-300-babyface-facial-at-park-avenue-medspa-1294920769_display_image.jpg", 
                    "image_small": "http://img.ioscake.com/iphone/85-for-300-babyface-facial-at-park-avenue-medspa-1294920769_small_image.jpg"
                }, 
                "division": {
                    "slug": "new-york", 
                    "name": "New York", 
                    "active": 1, 
                    "time_zone_diff": -4, 
                    "lat": "40.7142690000000000", 
                    "lon": "-74.0059730000000000", 
                    "url": "http://yipit.com/new-york/"
                }, 
                "tags": [
                    {
                        "name": "Facial", 
                        "slug": "facial", 
                        "url": "http://yipit.com/new-york/deals/facial/"
                    }, 
                    {
                        "name": "Spa", 
                        "slug": "spa", 
                        "url": "http://yipit.com/new-york/deals/spa/"
                    }
                ], 
                "business": {
                    "name": "Park Avenue MedSpa", 
                    "url": "", 
                    "locations": [
                        {
                            "address": "565 Park Ave", 
                           "locality": "New York",
                            "phone": "212-593-8821", 
                            "lat": null, 
                            "lon": null
                        }
                    ]
                }, 
                "source": {
                    "name": "LivingSocial", 
                    "slug": "livingsocial", 
                    "paid": 0, 
                    "url": "http://yipit.com/new-york/livingsocial"
                }
            }
        ]
    }
}

Here is how I am parsing it:

  • WaveForm on IOS
  • UIPrintInteractionController not displaying in iPad
  • Timeline Progress bar for AVPlayer
  • how to convert UIView to UIImage without background?
  • AdMob in all my view controllers?
  • how can I Add a ABRecordRef to a NSMutableArray in iPhone?
  •     NSArray *deals = [[results objectForKey:@"response"] valueForKey:@"deals"];
        NSLog(@"%@",[[results objectForKey:@"response"] valueForKey:@"deals"]);
    
        for(NSDictionary* deal in deals)
        {
            NSLog(@"Title: %@", [deal valueForKey:@"title"]);
            NSLog(@"URL: %@", [deal valueForKey:@"url"]);
            NSLog(@"Value: %@", [[deal valueForKey:@"value"] valueForKey:@"formatted"]);
            NSLog(@"Picture URL: %@", [[deal valueForKey:@"images"] valueForKey:@"image_small"]);
            NSLog(@"Business: %@", [[deal valueForKey:@"business"] valueForKey:@"name"]);
            NSLog(@"Address: %@", [[[deal valueForKey:@"business"] valueForKey:@"locations"] valueForKey:@"address"]);
            NSLog(@"City: %@", [[[deal valueForKey:@"business"] valueForKey:@"locations"] valueForKey:@"locality"]);
            NSLog(@"Phone: %@", [[[deal valueForKey:@"business"] valueForKey:@"locations"] valueForKey:@"phone"]);
    
            [items addObject:deal];
        }
    

    My logging looks good except for Address, City and Phone. Here is the log:

    Title: $10 for $20 Worth of Food and Drinks at Blondies in Tempe
    URL: http://yipit.com/aff/click/?deal=cHBPNZ3w&key=93HU7t2d
    Value: $20
    Picture URL: http://img.ioscake.com/iphone/50-off-at-blondies-sports-bar-1298454745_small_image.jpg
    Business: Blondies Sports Bar
    Address: (
        "501 S Mill Ave"
    )
    City: (
        Tempe
    )
    Phone: (
        "702-737-0444"
    )
    

    3 Solutions Collect From Internet About “Help parsing a nested JSON object”

    From the JSON you provided, locations is an array (that’s what the square brackets mean), so the values that are returned from valueForKey: are contained in NSArray instances (hence the parentheses).

    You could use objectAtIndex: before the last call to valueForKey: to obtain just the value you’re looking for.

    By the way, you can also use valueForKeyPath: to simplify accessing nested values, for example

    [deal valueForKeyPath:@"business.name"];
    

    [[deal valueForKey:@"business"] valueForKey:@"locations"] returns an array. Calling -valueForKey: on an NSArray executes valueForKey: for every object in the array and returns an array of the results (see the NSArray documentation for this). So that’s what you get, an array of the corresponding values.

    You could try changing your code to something like this:

    NSDictionary *primaryLocation =  [[[deal valueForKey:@"business"] valueForKey:@"locations"] objectAtIndex:0];
    NSLog(@"Address: %@", [primaryLocation valueForKey:@"address"]);
    NSLog(@"City: %@", [primaryLocation valueForKey:@"locality"]);
    NSLog(@"Phone: %@", [primaryLocation valueForKey:@"phone"]);