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 无法按预期工作

逐行文件 io 在 Windows 中无法按预期工作

在 ionic 3 中,branch.io deeplink 无法按预期工作

iOS 通用链接无法按预期工作 - 无论路径如何,都始终打开

.play() 在 React 组件上无法按预期工作

表格宽度在 Firefox html 上无法按预期工作