Iphone 帮助解析嵌套的JSON对象
我有以下JSON:Iphone 帮助解析嵌套的JSON对象,iphone,objective-c,cocoa-touch,json,nsdictionary,Iphone,Objective C,Cocoa Touch,Json,Nsdictionary,我有以下JSON: { "meta": { "code": 200 }, "response": { "deals": [ { "id": 32373, "date_added": "2011-01-13 12:12:50", "end_date": "2011-01-14 10:00:00",
{
"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"
}
}
]
}
}
以下是我如何解析它:
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];
}
NSDictionary *primaryLocation = [[[deal valueForKey:@"business"] valueForKey:@"locations"] objectAtIndex:0];
NSLog(@"Address: %@", [primaryLocation valueForKey:@"address"]);
NSLog(@"City: %@", [primaryLocation valueForKey:@"locality"]);
NSLog(@"Phone: %@", [primaryLocation valueForKey:@"phone"]);
我的日志记录看起来不错,除了地址、城市和电话。以下是日志:
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”]
返回一个数组。在NSArray
上调用-valueForKey:
会对数组中的每个对象执行valueForKey:
,并返回一个结果数组(有关此信息,请参阅NSArray文档)。这就是您得到的,一个对应值的数组。从您提供的JSON中,locations
是一个数组(这就是方括号的意思),因此从valueForKey:
返回的值包含在NSArray实例中(因此是括号)
您可以在最后一次调用valueForKey:
之前使用objectAtIndex:
,仅获取您要查找的值
顺便说一下,您还可以使用valueForKeyPath:
来简化对嵌套值的访问,例如
[deal valueForKeyPath:@"business.name"];
您可以尝试将代码更改为以下内容:
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];
}
NSDictionary *primaryLocation = [[[deal valueForKey:@"business"] valueForKey:@"locations"] objectAtIndex:0];
NSLog(@"Address: %@", [primaryLocation valueForKey:@"address"]);
NSLog(@"City: %@", [primaryLocation valueForKey:@"locality"]);
NSLog(@"Phone: %@", [primaryLocation valueForKey:@"phone"]);
根据您提供的JSON,
locations
是一个数组,因此从valueForKey:
返回的值包含在NSArray实例中(因此包含括号)。感谢您的说明。我对valueForKeyPath感兴趣,我不知道。我尝试了下面的代码段,但它返回null。您可以编辑您的答案以显示完整的代码吗?上面示例中对valueToKeyPath:
的调用可以替代类似的表达式(来自您发布的代码)[[deal valueForKey:@“business”]valueForKey:@“name”]
,其含义基本相同。仍然有点困惑,您能告诉我如何从返回的NSArray中提取该值吗?使用objectAtIndex:
获取数组中的项。