Help parsing a nested JSON object

非 Y 不嫁゛ 提交于 2019-11-30 19:17:51

问题


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



回答2:


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




回答3:


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


来源:https://stackoverflow.com/questions/5129665/help-parsing-a-nested-json-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!