ブログ投稿SAVINGJSONTO CORE DATAには、JSON応答をCoreDataエンティティに変換するための優れたヒントがいくつかあります。私がやりたいことはもう少し具体的です。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;
}