2012-02-23 64 views
0

我正在製作一個iPhone應用程序,其中我從http://maps.googleapis.com/maps/api/geocode/json?address=canada&sensor=true檢索JSON數據,然後我將它存儲在一個NSDictionary對象。我的代碼編譯得很好,並且JSON數據是有效的。但是,當我查找某些密鑰時,即使密鑰存在,它也會返回零,但我不會輸入錯誤。這是唯一可行的關鍵(飼料是一個NSDictionary對象):獲取objectForKey:在NSDictionary與JSON數據返回零即使密鑰存在

NSString *status = [[NSString alloc] initWithFormat:[feed objectForKey:@"status"]]; 

但是當我做這樣的事情:

NSString *longName = [[NSString alloc] initWithFormat:[feed objectForKey:@"long_name"]]; 

我得到這個錯誤:

WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: * -[NSPlaceholderString initWithFormat:locale:arguments:]: nil argument

我有兩個問題:我該如何解決這個問題?此外,如果存在多個同名的地點(即「Springfield」),則Google Geocoder可以返回多個地點,那麼我如何選擇要引用的密鑰? (比如哪個「long_name」,哪個「lat」等等......)

在此先感謝!

回答

5

「狀態」的工作原因是因爲它位於字典的根部,而長名稱和大多數其他部分位於子數組內的子字典中。嘗試這樣的事情,而不是:

NSArray *results = [feed objectForKey:@"results"]; 
NSDictionary *firstResult = [results objectAtIndex:0]; 
NSArray *addressComponents = [firstResult objectForKey:@"address_components"]; 
NSDictionary *firstAddress = [addressComponents objectAtIndex:0]; 
NSString *longName = [firstAddress objectForKey:@"long_name"]; 

如果你想獲得的所有值下聽到你當然需要建立循環 - 我給的示例顯示瞭如何從第一個獲得長名稱返回第一個結果內的地址。

+0

工作得很好,我唯一需要改變的地方是'結果'到'NSArray'對象,因爲顯然'NSDictionary'不響應'objectAtIndex:'。謝謝你的幫助! – 2012-02-24 00:31:27

+0

糟糕 - 複製/粘貼錯誤。我在回覆中修正了它 – 2012-02-24 00:37:00