我有一个json字符串
{"name":"test","bar":{"name":"testBar"}}
在目标c中我有一个对象
@interface Foo : NSObject {
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Bar * bar;
@end
我只是综合了这些属性。我有一个具有综合属性的子对象。
@interface Bar : NSObject {
}
@property (nonatomic, retain) NSString * name;
@end
然后这里是我试图进入Foo对象的代码,其中响应是上面的json字符串:
SBJsonParser *json = [[SBJsonParser new] autorelease];
parsedResponse = [json objectWithString:response error:&error];
Foo * obj = [[Foo new] autorelease];
[obj setValuesForKeysWithDictionary:parsedResponse];
NSLog(@"bar name %@", obj.bar.name);
这会在NSLog语句中引发异常:
-[__NSCFDictionary name]: unrecognized selector sent to instance 0x692ed70'
但如果我将代码更改为有效:
NSLog(@"bar name %@", [obj.bar valueForKey:@"name"]);
我很困惑为什么我不能做第一个例子,或者我做错了什么?
答案 0 :(得分:7)
你试过这个吗?
// Foo class
-(void)setBar:(id)bar
{
if ([bar class] == [NSDictionary class]) {
_bar = [Bar new];
[_bar setValuesForKeysWithDictionary:bar];
}
else
{
_bar = bar;
}
}
答案 1 :(得分:6)
-setValuesForKeysWithDictionary:
不够聪明,无法识别键“bar”的值应该是Bar
的实例。它正在为该属性分配NSDictionary
。因此,当您要求属性“name”时,字典无法表示该请求。但是,NSDictionary
确实知道如何处理-valueForKey:
,因此恰好适用于该情况。
因此,您需要使用比-setValuesForKeysWithDictionary:
更智能的内容来填充对象。