2009-12-17 54 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