我正在使用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”,但是......知道未来会很好......
感谢。
答案 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返回的数组的长度。)