0

ブログ投稿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;
    }
4

2 に答える 2

3

私は SBJSON ライブラリと ASIHttpRequest を使用して、独自の設計の Web サービスから JSON をフェッチして消費します。質問を正しく理解していれば、次のようなことを行うだけで済みます。

NSString *responseJSONasString = [fetchRequest responseString]; 
NSDictionary *itemResponseArray = [responseJSONasString JSONValue];

SBJSON ライブラリは、 NSObject への変換を行い、JSON 要素の key:value コーディングを使用してそれらを配列/辞書に配置します。そのため、提供された JSON を使用して、最初のヒーローの名前を取得できます。

NSArray *heroes = [itemResponseArray objectForKey:@"heroes"];
NSDictionary *firstHero = [heroes objectAtIndex:0];
NSString *heroName = [firstHero objectForKey:"name"];

SBJson はここにあります: http://stig.github.com/json-framework/

于 2012-09-10T15:48:44.203 に答える