尝试解析由 iOS 项目的 RESTful Web APS 返回的 json 数组
Posted
技术标签:
【中文标题】尝试解析由 iOS 项目的 RESTful Web APS 返回的 json 数组【英文标题】:Trying to parse json array returned by a restful web APS for an iOS project 【发布时间】:2012-12-01 08:03:47 【问题描述】:我正在尝试解析由 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 都很陌生,所以如果我做了什么特别愚蠢的事情,我深表歉意。
【问题讨论】:
【参考方案1】:您的 JSON 示例中实际上没有名为 menuItem
的项目。您的代码看起来就像是为解析 JSON 而编写的,如下所示:
[ "menuItem" : "name" : "Aesops Bagels",
…
,
]
即,它在列表中的每个字典中都需要一个“menuItem”键。 如果您实际上是在尝试解析您发布的 sn-p,我认为您只需要从此简化循环代码:
NSDictionary *menuItem = [diction objectForKey:@"menuItem"];
NSString *name = [menuItem objectForKey:@"name"];
到:
NSString *name = [diction objectForKey:@"name"];
在尝试将其添加到结果数组之前,您可能还需要确保该名称不为零,以防万一您的数据有一个缺少名称的条目。
【讨论】:
是的,完全是这样,我更改了一行代码,它现在可以工作了!我正在关注一个解析不同 JSON 的教程,并且对何时/如何偏离他们的代码有点困惑。但无论如何,非常感谢!【参考方案2】:正如 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"];
顺便说一句,如果您真的担心某些字典条目可能没有“名称”条目,而一行 valueForKey
处理该问题,其他行则需要添加条件逻辑,例如:
for (NSDictionary *diction in allDataArray)
id value = diction[@"name"];
if (value == nil)
value = [NSNull null];
[array addObject:value];
;
显然,我将NSNull
添加到数组中,以便您知道有一个没有名称的字典条目。您想如何处理这种情况(例如,添加 NSNull、简单地添加任何内容等)取决于您,但希望这能给您带来想法。但我认为主要问题是“menuitem”引用,所以这可能没有实际意义。
【讨论】:
感谢您对我的问题的额外想法!主要问题是“menuitem”参考,但非常感谢任何有助于增加我对使用 xcode 的理解的帮助!以上是关于尝试解析由 iOS 项目的 RESTful Web APS 返回的 json 数组的主要内容,如果未能解决你的问题,请参考以下文章
一基础项目构建,引入web模块,完成一个简单的RESTful API
笔记︱利用python + flask制作一个简易本地restful API