【发布时间】:2012-09-10 15:02:22
【问题描述】:
博文SAVING JSON TO CORE DATA 提供了一些将JSON 响应转换为Core Data 实体的重要技巧。我想做的是更具体一点。我想获取 JSON 响应,并使用博客文章中的方法将对象转换为 NSObject,其属性表示响应对象。我遇到的问题是对象的嵌套属性。以这个 JSON 响应为例:
http://us.battle.net/api/d3/profile/rnystrom-1254/
使用博文中描述的方法,“name”和“level”等简单属性很容易转换为 NSString 和 NSNumber 对象。但是,在查看响应的更复杂部分时会出现问题:嵌套数组/字典。
我发现的唯一解决方案是手动编码查找和转换所有这些属性,我认为这是一种非常糟糕的做法。这是我正在做的事情的摘录:
NSDictionary *skillsDictionary = json[@"skills"];
if ([skillsDictionary isKindOfClass:[NSDictionary class]]) {
NSArray *activeArray = skillsDictionary[@"active"];
NSArray *passiveArray = skillsDictionary[@"passive"];
NSMutableArray *mutActives = [NSMutableArray array];
NSMutableArray *mutPassives = [NSMutableArray array];
if ([activeArray isKindOfClass:[NSArray class]]) {
[activeArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[NSDictionary class]]) {
NSDictionary *activeJSON = (NSDictionary*)obj;
D3Skill *skill = [D3Skill activeSkillFromJSON:activeJSON];
if (skill) {
[mutActives addObject:skill];
}
}
}];
}
if ([passiveArray isKindOfClass:[NSArray class]]) {
[passiveArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[NSDictionary class]]) {
NSDictionary *passiveJSON = (NSDictionary*)obj;
D3Skill *skill = [D3Skill passiveSkillFromJSON:passiveJSON];
if (skill) {
[mutPassives addObject:skill];
}
}
}];
}
self.activeSkills = mutActives;
self.passiveSkills = mutPassives;
}
【问题讨论】:
标签: iphone ios json nsobject key-value-coding