2011-05-27 70 views
1

我有一个OData服务可以返回对象集合的JSON值。我想将一个iPhone应用程序指向一个JSON对象的集合,而不是该服务(结果如下,带有一个示例记录)。如何在Objective-C的集合中提取嵌套的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" 
     ... 
    } 
} 

回答

3

看来你有一个根密钥 “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生成器。所以我无法确定它始终是最好的挖掘方式,但在这种情况下似乎是这样。请记住:

  • [数据1,数据2,数据3,数据4] - >阵列
  • {键:数据1,键2:数据2} - >词典
+0

这绝对是让我在那里。我如何继续链接进一步下去?这是挖掘所需数组值的最佳方法吗? – 2011-05-27 14:43:11

+0

感谢您的更新 - 虽然这产生了这个异常' - [__ NSArrayM allKeys]:无法识别的选择发送到实例0x4c458d0'(注意这是假设我替换responseDict初始化与您的第二行在我的代码上面) – 2011-05-27 14:46:23

+0

我编辑,希望它是清除,让我知道,如果不是 – chriscatfr 2011-05-27 15:17:22

1

从它的外观来看,d是另一个字典的关键,它包含他们的密钥results,它包含一个包含数据的数组。尝试使用

NSLog(@"%@", responseDict); 

查看整个树层次结构。

+0

谢谢,这绝对有助于轻松打印字典。我想找到一个单独的属性,但不确定最好的方法(例如,如何获得“Property1”的价值) – 2011-05-27 14:44:18