博客文章将JSON 保存到核心数据中提供了一些将 JSON 响应转换为核心数据实体的重要技巧。我想做的是更具体一点。我想获取 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;
}