2

NSJSONSerialization を使用して PHP サーバーから JSON を解析する際に問題が発生しています。JSLint は、私の JSON は有効であると言っていますが、1 ~ 2 レベルしか取得できないようです。

これは基本的に私の JSON 構造です。

{
    "products":
    [{
        "product-name":
        {
            "product-sets":
            [{
                "set-3":
                {
                    "test1":"test2",
                    "test3":"test4"
                },
                "set-4":
                {
                    "test5":"test6",
                    "test7":"test8"
                }
            }]
        },
        "product-name-2":
        {
            "product-sets":
            [{

            }]
        }
    }]
}

そして、これを解析するための私のコードは次のとおりです。

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
if (json) {
    NSArray *products = [json objectForKey:@"products"];              // works
    for (NSDictionary *pItem in products) {                           // works
        NSLog(@"Product: %@", pItem);                                 // works, prints the entire structure under "product-name"
        NSArray *productSets = [pItem objectForKey:@"product-sets"];  // gets nil
        for (NSDictionary *psItem in productSets) {
            // never happens
        }
    }
}

私はこれで数時間車輪を回してきましたが、どこを探しても似たようなものは見つかりません. 私が気付いていない制限はありますか、それとも明らかなものが見えないだけですか?

4

1 に答える 1

4

ネストされたオブジェクトを 1 つ見逃しました

NSArray *productSets = [[pItem objectForKey:@"product-name"] objectForKey:@"product-sets"];

このCLIプログラムでテストしました

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {


        NSString *jsonString = @"{\"products\":[{\"product-name\": {\"product-sets\": {\"set-3\":{\"test1\":\"test2\", \"test3\":\"test4\"}, \"set-4\":{\"test5\":\"test6\", \"test7\":\"test8\"} }}}, {\"product-name-2\": \"2\"}]}";
        // insert code here...
        NSLog(@"%@", jsonString);
        NSError *error;
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];

        if (json) {
            NSArray *products = [json objectForKey:@"products"];              // works
            for (NSDictionary *pItem in products) {                           // works
                NSLog(@"Product: %@", pItem);                                 // works, prints the entire structure under "product-name"
                NSArray *productSets = [[pItem objectForKey:@"product-name"] objectForKey:@"product-sets"];  // gets nil
                for (NSDictionary *psItem in productSets) {
                    NSLog(@"%@", psItem);
                }
            }
        }

    }
    return 0;
}

あなたのjsonのいくつかは非常に奇妙であることに注意してください:

フラット化されたオブジェクトごとに、キーは同じでなければなりません。オブジェクトの数値を含むキーはあまり意味がありません。単一のオブジェクトを追跡する必要がある場合は、適切な値を持つ id キーを含めます。

于 2012-08-23T16:45:54.953 に答える