6

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

[{
"date": "2011-03-21",
"meal": "BREAKFAST",
"category": "BREAKFAST BAKERY",
"recipe": "213012",
"name": "Aesops Bagels",
"portion": "1",
"unit": "each"},

我正在尝试获取“名称”信息,然后将其存储到 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”而终止应用程序,原因:“*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil”

所以我很确定在 for 循环上方的行中发生了错误,这导致数组尝试将其nil作为一个值。但是任何帮助弄清楚出了什么问题/如何成功解析这个 json 将不胜感激。我对 json、xcode 和 iOS 都很陌生,所以如果我做了任何特别愚蠢的事情,我深表歉意。

4

2 回答 2

1

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

[{ "menuItem" : { "name" : "Aesops Bagels",
                  …
                }
 },
]

即,它在列表中的每个字典中都需要一个“menuItem”键。如果您实际上是在尝试解析您发布的代码段,我认为您只需要从此简化循环代码:

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

到:

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

在尝试将其添加到结果数组之前,您可能还需要确保名称不为零,以防万一您的数据有一个缺少名称的条目。

于 2012-12-01T08:12:02.207 回答
1

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

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

或者

[allDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [array addObject:obj[@"name"]];
}];

或者,更简单地说,制作array一个不可变的NSArray而不是 aNSMutableArray并使用以下内容:

NSArray *array = [allDataArray valueForKey:@"name"];

顺便说一句,如果您真的担心某些字典条目可能没有“名称”条目,而一行valueForKey处理该条目,则其他行将需要添加条件逻辑,例如:

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

显然,我将 a 添加NSNull到数组中,以便您知道有一个没有名称的字典条目。你想如何处理这种情况(例如,添加一个 NSNull,简单地不添加任何内容等)取决于你,但希望这会给你这个想法。但我认为主要问题是“menuitem”参考,所以这可能没有实际意义。

于 2012-12-01T15:21:41.173 回答