【问题标题】:How can I pull out nested JSON values in a collection in objective-C?如何在 Objective-C 的集合中提取嵌套的 JSON 值?
【发布时间】:2011-05-27 13:40:42
【问题描述】:

我有一个 OData 服务,它可以为对象集合返回 JSON 值。我想将一个 iPhone 应用程序指向该服务之外的 JSON 对象集合(结果如下所示,带有一个示例记录)。

如何解析这些嵌套值?当我将响应字符串转换为 JSON 值时,它只抓取“d”(我的代码也在下面)。

{
"d" : {
"results": [
{
"__metadata": {
"uri": "http://someserver/service.svc/collection(1234L)", "type": "My.Namespace.Type"
}, "Property1": "value1", "Property2": 7274, "Collection1": {
"__deferred": {
"Property3": "http://someserver/service.svc/collection(1234L)/Images"
}
}
},
...

示例目标 C 代码:

- (void)requestFinished:(ASIHTTPRequest *)request
{
    if (request.responseStatusCode == 200)
    {
        NSString *responseString = [request responseString];

        textView.text = responseString;

        NSDictionary *responseDict = [responseString JSONValue];
        NSArray *keys = [responseDict allKeys];

        [self printArray:keys]; // This prints "d"
        ...
     }
}

【问题讨论】:

    标签: iphone objective-c json ios4


    【解决方案1】:

    好像你有一个根键“d”,所有的键实际上都是子键,试试

    NSDictionary *responseDict = [[responseString JSONValue] objectForKey:@"d"];
    

    甚至

    NSArray *responseArray = [[[responseString JSONValue] objectForKey:@"d"] objectForKey:@"results"];
    

    这是 NSArray 和 NSDictionnary 的交替:

    NSDictionary *responseDict = [[responseString JSONValue] valueForKey:@"d"];
    NSArray *responseArray = [responseDict valueForKey:@"results"];
    
    NSDictionary *dict;
    for(int i=0; i< [responseArray count]; i++){
        dict = [responseArray objectAtIndex:i];
        NSLog(@"- %@",[responseArray objectAtIndex:i]);
    
    }
    

    它始终强烈依赖于您的 JSON 生成器。所以我不能肯定地告诉你它总是最好的挖掘方式,但在这种情况下似乎是这样。请记住:

    • [data1,data2,data3,data4] -> 数组
    • {key1:data1,key2:data2} -> 字典

    【讨论】:

    • 这绝对能让我到达那里。我如何继续链接以进一步下降?这是挖掘所需值数组的最佳方式吗?
    • 感谢您的更新 - 尽管这会产生此异常 -[__NSArrayM allKeys]: unrecognized selector sent to instance 0x4c458d0(请注意,这是假设我在上面的代码中将 responseDict 初始化替换为您的第二行)
    • 感谢您的更新!这正是我一直在寻找的……一旦我理解了 JSON 数组表示法并使用了更新的代码,我就能够轻松地使用它。
    【解决方案2】:

    从外观上看,d 是另一个字典的键,其中包含它们的键 results,其中包含包含您的数据的数组。尝试使用

    NSLog(@"%@", responseDict);
    

    查看整个树的层次结构。

    【讨论】:

    • 谢谢,这对轻松打印字典很有帮助。我想获得几个级别的单个属性,但不确定最好的方法(例如,如何获得“Property1”的值)
    【解决方案3】:

    您可以使用json-framework 将json 数据转换为NSDictionary

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多