3

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://d22nv2k05ynu7x.cloudfront.net/deal_images/deal/85-for-300-babyface-facial-at-park-avenue-medspa-1294920769_display_image.jpg", 
                    "image_small": "http://d22nv2k05ynu7x.cloudfront.net/deal_images/deal/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:

    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://d22nv2k05ynu7x.cloudfront.net/deal_images/deal/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"
)
1
  • From the JSON you provided, locations is an array, so the values that are returned from valueForKey: are contained in NSArray instances (hence the parentheses). Commented Feb 26, 2011 at 21:00

3 Answers 3

16

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"];
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for the clarification. I'm interested in valueForKeyPath, I did not know that. I tried your following snippet, but it returns null. Could you edit your answer to show the full code?
The call to valueToKeyPath: in the example above can be a substituted for expressions like this (from the code you posted) [[deal valueForKey:@"business"] valueForKey:@"name"], and mean essentially the same thing.
0

[[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.

2 Comments

Still a bit confused, can you show me how to pull that value out from the NSArray that is returned?
Use objectAtIndex: to get at an item in the array.
0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.