【问题标题】:Cannot access NSDictionary无法访问 NSDictionary
【发布时间】:2012-06-25 17:46:06
【问题描述】:

我使用 PHP 脚本创建了一个 JSON。 我正在阅读 JSON,可以看到数据已被正确读取。 但是,在访问对象时,我会收到无法识别的选择器发送到实例...

似乎无法找到为什么在太多小时之后。任何帮助都会很棒!

我的代码是这样的:

NSDictionary *json = [[NSDictionary alloc] init];
json = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];

NSLog(@"raw json = %@,%@",json,error);  

NSMutableArray *name = [[NSMutableArray alloc] init];

[name addObjectsFromArray: [json objectForKey:@"name"]];

代码在到达上面最后一行时崩溃。

输出如下:

raw json = (
        {
        category = vacancies;
        link = "http://blablabla.com";
        name = "name 111111";
        tagline = "tagline 111111";
    },
        {
        category = vacancies;
        link = "http://blobloblo.com";
        name = "name 222222222";
        tagline = "tagline 222222222";
    }
),(null)
2012-06-23 21:46:57.539 Wind expert[4302:15203] -[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0xdcfb970

求助!!!

【问题讨论】:

  • 仅供参考,除非您使用 ARC,否则您的第一行代码将导致泄漏。无论哪种方式,这都是不必要的分配。

标签: ios json object dictionary key


【解决方案1】:

json 是您显示的数组,而不是字典。我可以这么说是因为json 的整个日志输出都带有括号。数组内部是字典,我可以通过它们被大括号包围的事实来判断。

所以,看起来你想要这样的东西:

NSError *error = nil;
NSArray *json = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];

NSLog(@"raw json = %@,%@",json,error);  

NSMutableArray *name = [[NSMutableArray alloc] init];
for (NSDictionary *obj in json) {
    [name addObject:[obj objectForKey:@"name"]];
}

顺便说一句,您会注意到,在用JSONObjectWithData:options:error: 覆盖下一行之前,我已将json 的不必要初始化删除到一个对象中。在 ARC 世界中,它不会是泄漏,但仍然完全没有必要分配一个对象只是为了稍后再次摆脱它。我还添加了 NSError *error = nil; 行,因为它不存在并且显然是编译所必需的。

【讨论】:

  • @michaelblaize 很高兴它为您解决了这个问题。我知道你是新来的 - 所以我会指出这个想法是通过点击你认为是正确答案左侧的勾号来接受。
【解决方案2】:

问题似乎是您的 JSON 的根级别是一个数组,而不是一个字典(注意括号而不是大括号作为记录输出中的第一个字符)。数组没有 objectForKey 选择器。也许您打算先获取 objectAtIndex:0,或者遍历所有项目?

顺便说一句,您的代码的第一行完全浪费了 NSDictionary 的初始化。它只是在下一行被覆盖和释放。

【讨论】:

  • @H2CO3 这实际上是 ARC 项目中的内存泄漏吗?
  • 确实这不是 ARC 项目中的泄漏,这正是我们这些天应该谈论的规范。
猜你喜欢
  • 2016-03-11
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多