6

我正在尝试在以下名为“robotDesign”的 NSDictionary 中获取“@type”键的值

robotDesign : {
    "@id" = "2";
    "@type" = "piggyDash";
    turnAngle = "-90";
    width = "90.0";
}

这是我使用的 JSON 对象的一部分

[NSJSONSerialization JSONObjectWithData: options: error:];

我正在使用以下代码提取@type 值

NSString * robot_type = (NSString*)[robotDesign valueForKey:@"@type"];

但收到以下错误:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[<__NSCFDictionary 0x71de9e0> valueForUndefinedKey:]:此类不符合键类型的键值编码。”

注意:请注意字典中的其他对象,如“turnAngle”和“width”,可以使用上面给出的相同代码轻松提取,但使用它们各自的键。

4

2 回答 2

13

尝试

NSString * robot_type = [robotDesign objectForKey:@"@type"];

或删除前导@

来自文档:

valueForKey:
返回与给定键关联的值。

- (id)valueForKey:(NSString *)key
参数key 要为其返回相应值的键。请注意,使用键值编码时,键必须是字符串(请参阅“键值编码基础”)。

返回值
与键关联的值。

讨论如果 key 不以“@”开头,则调用 objectForKey:。如果键确实以“@”开头,则去掉“@”并使用键的其余部分调用 [super valueForKey:]。

@导致调用valueForKey:NSDictionary的超类的实现。但是 NSObject 对 key 一无所知type

于 2012-11-08T17:46:56.100 回答
6

这是完美记录的行为。来自NSDictionary 的类参考:

NSDictionary 覆盖了 'valueForKey:' 方法。如果键以“@”字符开头,则调用 super,否则调用 objectForKey:

因此,除非您有正当理由不这样做,否则您应该使用- objectForKey:.

于 2012-11-08T17:52:14.943 回答