我试图在以下名为'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”)可以使用上面给出的相同代码轻松提取,但使用各自的键。
答案 0 :(得分:13)
试
NSString * robot_type = [robotDesign objectForKey:@"@type"];
或删除前导@
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:
。