当父密钥未知时,在嵌套的NSDictionary中查找对象?

时间:2009-12-17 16:01:08

标签: iphone objective-c json bit.ly

我正在使用yajl_JSON库从bit.ly url缩短服务的JSON响应中生成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”不是孩子的“结果”。在解析时,我有3个嵌套的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。

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

感谢。

2 个答案:

答案 0 :(得分:4)

NSDictionary方法allValues返回未从其键中附加的字典中的值数组,而NSArrays的Key-Value Coding为数组中的所有项生成给定键值的数组。因此,您可以[[jsonResponse valueForKeyPath:@"results.allValues.shortURL"] objectAtIndex:0]来获取shortURL。

答案 1 :(得分:3)

假设您有一个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"];

或者,如果您也想要长网址,请使用allKeys

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

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