OStack程序员社区-中国程序员成长平台

标题: objective-c - NSJSONSerialization 只获取根 key [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 22:31
标题: objective-c - NSJSONSerialization 只获取根 key

我在使用 NSJSONSerialization 从 PHP 服务器解析 JSON 时遇到问题。 JSLint 说我的 JSON 是有效的,但似乎只能进入一两个级别。

这本质上是我的 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(@"roduct: %@", pItem);                                 // works, prints the entire structure under "product-name"
        NSArray *productSets = [pItem objectForKey"product-sets"];  // gets nil
        for (NSDictionary *psItem in productSets) {
            // never happens
        }
    }
}

我已经为此旋转了几个小时,但在我搜索的任何地方都找不到类似的东西。是否有任何我不知道的限制,或者我只是没有看到明显的东西?



Best Answer-推荐答案


你错过了一个嵌套对象

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(@"roduct: %@", 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 键。

关于objective-c - NSJSONSerialization 只获取根 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095200/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4