在包含@字符的密钥的NSDictionary中获取valueForKey时出错

时间:2012-11-08 17:44:05

标签: objective-c ios cocoa-touch nsstring nsdictionary

我试图在以下名为'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:]:这个   class不是密钥类型的密钥值编码兼容。'

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

2 个答案:

答案 0 :(得分:13)

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

或删除前导@

from the docs:

  

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

     

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

     

返回值
  与key关联的值。

     

讨论如果key不以“@”开头,则调用objectForKey:。如果   key以“@”开头,剥离“@”并调用[super   valueForKey:]和其余的密钥。

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

答案 1 :(得分:6)

这是完全记录的行为。来自NSDictionary's class reference:

  

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

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