Iphone 帮助解析嵌套的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",

我有以下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"
                }
            }
        ]
    }
}
以下是我如何解析它:

    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:
获取数组中的项。