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"
)
[[deal valueForKey:@"business"] valueForKey:@"locations"]
returns an array. Calling-valueForKey:
on anNSArray
executesvalueForKey:
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:
From the JSON you provided,
locations
is an array (that's what the square brackets mean), so the values that are returned fromvalueForKey:
are contained in NSArray instances (hence the parentheses).You could use
objectAtIndex:
before the last call tovalueForKey:
to obtain just the value you're looking for.By the way, you can also use
valueForKeyPath:
to simplify accessing nested values, for example