尝试为iOS项目解析restful web APS返回的json数组

尝试为iOS项目解析restful web APS返回的json数组,ios,json,xcode,parsing,Ios,Json,Xcode,Parsing,我试图解析RESTful web API返回的JSON数组,该API看起来类似于以下内容(使用jsonviewer,JSON作为数组中的一组字典返回): 我试图获取“名称”信息,然后将其存储到tableview中。下面是我用来实现这一目标的代码: -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSArray *allDataArray = [NSJSONSerialization JSONObjectW

我试图解析RESTful web API返回的JSON数组,该API看起来类似于以下内容(使用jsonviewer,JSON作为数组中的一组字典返回):

我试图获取“名称”信息,然后将其存储到tableview中。下面是我用来实现这一目标的代码:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSArray *allDataArray = [NSJSONSerialization JSONObjectWithData:webData 
                                                            options:0 
                                                              error:nil];

    for (NSDictionary *diction in allDataArray) {
        NSDictionary *menuItem = [diction objectForKey:@"menuItem"];
        NSString *name = [menuItem objectForKey:@"name"];

        [array addObject:name];
    }

    [[self MyTableView]reloadData];
}
我得到的错误是:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“***-[\uu NSArrayM insertObject:atIndex:]:对象不能为零”


因此,我非常确定for循环上方的行中发生了错误,这导致数组尝试将
nil
作为值。但是,如果能帮助您找出哪里出了问题/如何成功解析此json,我们将不胜感激。我对json、xcode和iOS都很陌生,因此如果我做了任何特别愚蠢的事情,我向您道歉。

您的json示例中实际上没有名为
menuItem
的项。您的代码看起来就像是为解析JSON而编写的,如下所示:

[{ "menuItem" : { "name" : "Aesops Bagels",
                  …
                }
 },
]
也就是说,在列表中的每个字典中都应该有一个“menuItem”键。 如果您确实在尝试解析您发布的代码段,我认为您只需要简化以下循环代码:

NSDictionary *menuItem = [diction objectForKey:@"menuItem"];
NSString *name = [menuItem objectForKey:@"name"];
致:


在尝试将名称添加到结果数组之前,您可能还需要确保名称不是nil,以防数据中的条目缺少名称。

正如ckhan所说,JSON对象只是一个字典数组,没有任何对“menuitem”的引用。如果事实上JSON对象中没有“menuitem”条目(即假设问题中提供的JSON具有代表性),那么它将是:

for (NSDictionary *diction in allDataArray)
    [array addObject:[diction objectForKey:@"name"]];

或者,更简单地说,将
array
设置为不可变
NSArray
而不是
NSMutableArray
,并使用以下各项:

NSArray *array = [allDataArray valueForKey:@"name"];
顺便说一句,如果您真的担心一些字典条目可能没有“name”条目,而一行
valueForKey
处理这个问题,那么其他的则需要添加条件逻辑,例如:

for (NSDictionary *diction in allDataArray) {
    id value = diction[@"name"];
    if (value == nil)
        value = [NSNull null];
    [array addObject:value];
};

显然,我正在向数组中添加一个
NSNull
,这样您就知道有一个没有名字的字典条目。您希望如何处理此场景(例如,添加一个NSNull,简单地不添加任何内容,等等)取决于您,但希望这能为您提供想法。但是我认为主要的问题是“menuitem”引用,所以这可能是没有意义的。

是的,完全是这样,我更改了一行代码,现在就可以工作了!我遵循的是一个解析不同JSON的教程,对于何时/如何偏离它们的代码有点困惑。但无论如何,非常感谢!谢谢你对我的问题有更多的想法!主要的问题是“menuitem”参考,但是非常感谢任何有助于提高我对使用xcode的理解的帮助!
[allDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [array addObject:obj[@"name"]];
}];
NSArray *array = [allDataArray valueForKey:@"name"];
for (NSDictionary *diction in allDataArray) {
    id value = diction[@"name"];
    if (value == nil)
        value = [NSNull null];
    [array addObject:value];
};