2011-05-27 51 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