JSON 在 iOS 上无法按预期工作
Posted
技术标签:
【中文标题】JSON 在 iOS 上无法按预期工作【英文标题】:JSON not working as expected on iOS 【发布时间】:2012-11-17 17:23:26 【问题描述】:我目前正在尝试解析这个 JSON
["id":"1","dish_name":"Pasta & ketchup","category":"main","rating":"5","rating_count":null,"author":"Me","ingredients":"Pasta\nKetchup\nWater","description":"Very good for students\nCheap too!","picture":null,"protein":"7","fat":"11","carbs":"12","calories":"244","developer_lock":"1","id":"2","dish_name":"Pasta & Kødsovs","category":"main","rating":"5","rating_count":null,"author":"Me","ingredients":"Pasta\nKødsovs\nWater","description":"Very good for students\nCheap too!","picture":null,"protein":"7","fat":"11","carbs":"12","calories":"244","developer_lock":"1"]
但它失败并因这段代码而崩溃
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
[connection release];
NSError *error = NULL;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
recipes = [[NSArray alloc] initWithArray:[json objectForKey:@"dish_name"]];
[uit reloadData];
有人有任何线索,为什么它崩溃并出现错误-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x8077240
?
提前致谢。
【问题讨论】:
您确实需要在代码中进行一些运行时错误检查。确保你的 "json
" 字典不是 nil (我怀疑这是怎么回事),如果是,打印出你的 "error
" NSError 的值。
NSLog(@"%@ %@",error,json);
返回 NULL 错误和我的 JSON。
看来dish_name 是一个字符串,而不是一个数组。
我该如何解决这个问题。 JSON 中有 2 个配方。
@RoboForm 看到我的回答。
【参考方案1】:
以[__NSCFArray objectForKey:]
开头的错误消息意味着您有一个 NSArray(JSON 的根对象是一个数组 - 请注意方括号的开始和结束),并且您正试图将其视为字典。总而言之,
recipes = [[NSArray alloc] initWithObject:[json objectForKey:@"dish_name"]];
应该是
recipes = [[NSArray alloc] initWithObject:[[json objectAtIndex:0] objectForKey:@"dish_name"]];
请注意,数组中有两个对象,因此您可能还想使用[json objectAtIndex:1]
。
编辑:如果您有动态数量的食谱,您可以这样做:
recipes = [[NSMutableArray alloc] init];
for (NSDictionary *dict in json)
[recipes addObject:[dict objectForKey:@"dish_name"]];
【讨论】:
在一行代码中发生多个“objectAtIndex
”和“objectForKey
”调用对我来说似乎也很冒险。如果“objectAtIndex
”意外返回不是字典的内容,则应用程序可能会以崩溃的方式运行。
@MichaelDautermann 对。我看到的是 JSON OP 包含一个数组(根元素),其中有两个字典。你可以打电话给objectForKey:
。我还修复了数组初始化不正确的错误。
现在它可以工作了.. 是的,但不是我想要的。如上面另一条评论所述,JSON 中有两个配方。 'recipes' NSArray 现在只包含第一个,而不是第二个。
@RoboForm 是什么阻止你写recipes = [[NSArray alloc] initWithObjects:[[json objectAtIndex:0] objectForKey:@"dish_name"], [[json objectAtIndex:1] objectForKey:@"dish_name"], nil];
?
@RoboForm 然后你可以将配方标题添加到一个可变数组中(见编辑)。【参考方案2】:
如果您的 json
NSDictionary 是一个真实有效的 NSDictionary 对象,您对此的调用:
[json objectForKey:@"dish_name"]
应该完全返回:
"Pasta & ketchup"
肯定不是数组。它是一个 NSString 对象。
这就是对“initWithArray
”的调用被轰炸的原因。
【讨论】:
JSON 中有 2 个配方。它还应该返回"Pasta & ketchup"
吗?
Michael Dautermann:不,这不是问题。根对象是一个数组而不是字典。
可能是这样(感谢 -1 票),但根据 RoboForm 的评论,他对“NSLog
”的调用正在为“json
”对象打印一些内容。
@MichaelDautermann 我明白了 - JSON 本身是有效的,只是它是一个数组,而不是字典。让我们看看我的回答是否解决了问题(我怀疑是这样)。
@Mat 我投了反对票,因为问题不仅在这里,而且甚至在代码流达到这一点之前。 OP 有一个数组,但将其视为字典 - 这也应该是固定的。以上是关于JSON 在 iOS 上无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
没有缓存的 iOS NSURLSessionConfiguration 无法按预期工作
在 ionic 3 中,branch.io deeplink 无法按预期工作