2009-12-17 122 views
3

我正在使用yajl_JSON库来从JSON响应中为bit.ly url缩短服务生成NSDictionary。当父键未知时,在嵌套的NSDictionary中查找对象?

JSON响应:

{ 
    errorCode = 0; 
    errorMessage = ""; 
    results = { 
     "http://www.example.com/" = { 
      hash = 4H5keM; 
      shortKeywordUrl = ""; 
      shortUrl = "http://bit.ly/4BN4qV"; 
      userHash = 4BN4qV; 
     }; 
    }; 
    statusCode = OK; 
} 

为了澄清, “http://example.com” 是不是孩子 “成果”。解析时,我有三个三个嵌套的NSDictionaries。

问题是“http://example.com”是任意键。我想在不知道密钥的情况下访问密钥数据。具体来说,我可以得到“shortUrl”的价值。 这怎么能有效地完成?有没有一种方法,使一个的keyPath这将是这样的:

"results.*.shortUrl" 

我已经通过执行下列步骤完成的,但我想这是不是做的方法:

// Parse the JSON responce 
NSDictionary *jsonResponce = [data yajl_JSON]; 

// Find the missing key 
NSString *missingKey = [[[jsonResponce valueForKeyPath:@"results"] allKeys] objectAtIndex:0]; 

// Log the value for "shortURL" 
NSLog(@"It is : %@", [[[jsonResponce objectForKey:@"results"] valueForKeyPath:missingKey] objectForKey:@"shortUrl"]); 

如果我使用的是XML,它可能很简单,这使我相信我没有正确使用json/objective-c。

我知道这将是可能存储“example.com”在这种情况下,当我提出请求Bit.ly,但...这将是很好的知道未来......

谢谢。

回答

4

NSDictionary方法allValues返回字典中值的数组,它们的键未从其中取出,Key-Value Coding为NSArrays生成数组中所有项的给定键值的数组。所以你可以做[[jsonResponse valueForKeyPath:@"results.allValues.shortURL"] objectAtIndex:0]以获得shortURL。

+0

这并不遗憾的是返回任何作为“shortURL”父母不是“结果”。 “结果”是“shortURL”的祖父母。 – Ross 2009-12-17 16:20:12

+0

哦,对不起,我误读了结构。 – Chuck 2009-12-17 16:35:08

+0

目前的版本是固定的,应该工作,顺便说一句。 – Chuck 2009-12-17 20:22:50

2

假设你已经一个NSDictionary results = [jsonResponce objectForKey:@"results]这是字典的这一部分:

{ 
    "http://www.example.com/" = { 
      hash = 4H5keM; 
      shortKeywordUrl = ""; 
      shortUrl = "http://bit.ly/4BN4qV"; 
      userHash = 4BN4qV; 
    }; 
}; 

你可以通过字典中的所有键循环:

NSString *shortURL = null; 
for (id key in results) { 
    NSDictionary* resultDict = [results objectForKey:key]; 
    shortURL = [resultDict objectForKey:@"shortURL"]; 
    NSLog(@"url: %@ shortURL: %@", key, shortURL); 
} 

或者,你可以得到所有的字典中的值并拔出第一个:

NSDictionary* resultDict = [[results allValues] objectAtIndex:0]; 
NSString *shortURL = [resultDict objectForKey:@"shortURL"]; 

,如果你想长的URL也使用allKeys

NSString *url = [[results allKeys] objectAtIndex:0] 
NSDictionary* resultDict = [results objectForKey:url]; 
NSString *shortURL = [resultDict objectForKey:@"shortURL"]; 

(请注意,您应该实际检查由allKeys和allValues返回的数组的长度)。

+0

感谢您的答案,但我的问题是,我有三个嵌套字典,不知道第二个(中)字典的唯一键。 您的解决方案仅应用单级字典。 – Ross 2009-12-17 19:19:24

+0

这是因为我认为你已经有了中间字典。我将把'jsonResponse'作为词典中的所有位置替换为'结果'来说明。 – 2009-12-17 20:02:54