我正在尝试解析由以下类似的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不能为nil'
所以我很确定在for循环上面的行中发生了错误,这导致数组尝试将nil
作为值。但任何帮助找出问题/如何成功解析这个json的任何帮助都将非常感激。我对json,xcode和iOS都很新,所以如果我做了特别愚蠢的事情我会道歉。
答案 0 :(得分:1)
您的JSON示例中实际上没有名为menuItem
的项目。您的代码看起来像是为了解析看起来像这样的JSON:
[{ "menuItem" : { "name" : "Aesops Bagels",
…
}
},
]
即,它期望列表中每个字典中的“menuItem”键。 如果您实际上正在尝试解析您发布的代码段,我认为您只需要简化您的循环代码:
NSDictionary *menuItem = [diction objectForKey:@"menuItem"];
NSString *name = [menuItem objectForKey:@"name"];
为:
NSString *name = [diction objectForKey:@"name"];
在尝试将名称添加到结果数组之前,您可能还需要确保该名称不是nil,以防您的数据有一个缺少名称的条目。
答案 1 :(得分: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
而不是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”参考,所以这可能没有实际意义。