簡體   English   中英

如何成功將JSON數據轉換為Objective-C對象?

[英]How to successfully convert JSON data to Objective-C objects?

所以我正在做的事情很簡單,從JSON格式的服務器獲取一些數據。 我正在使用Objective-C中的默認類(特別是NSJSONSerialization)將responseData getten轉換為JSON格式。

所以基本上 -

   NSString* testURL=@"http://ws.audioscrobbler.com/2.0/?method=track.getsimilar&artist=Kendrick+Lamar&track=A.D.H.D&api_key=e3f53f2f2896b44ff158a586b8ee15c7&format=json";

   NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:testURL]];

   NSDictionary* json = [NSJSONSerialization
                      JSONObjectWithData:responseData //1
                      options:kNilOptions
                      error:&error];

   NSArray* songList = [json objectForKey:@"similartracks"];

問題是,稍后當我嘗試訪問JSOn數據數組中的一個單獨對象時,就像這樣,

   NSDictionary* song1 = [songList objectAtIndex:0];

它給了我這個錯誤,

*由於未捕獲的異常'NSInvalidArgumentException'終止應用程序,原因:' - [__ NSCFDictionary objectAtIndex:]:無法識別的選擇器發送到實例0x96e2b60'

關於為什么會發生這種情況的任何想法?

我很感激幫助,coffeejay

似乎[json objectForKey:@"similartracks"]返回一個NSDictionary,嘗試這樣的事情:
NSArray* songList = [[json objectForKey:@"similartracks"] objectForKey:@"track"]

在處理這些事情時,你應該總是在嘗試使用它之前驗證你的響應,你永遠不應該相信任何輸入。 在您的情況下,您嘗試將objectAtIndex:消息發送到NSDictionary實例,這會引發無法識別的選擇器異常。

避免此類崩潰的一種簡單方法是檢查返回對象的類,例如:

id song1 = json[@"similartracks"]
if([song1 isKindOfClass:[NSArray class]])
{
    //Now we're sure it's an array
}

您聲明返回的數據是data ,但是您正在向NSJSONSerialization方法傳遞一個名為responseData的變量。

你的json可能不會在yhat點返回一個數組,而是一個字典。 顯示json內容,以便我們進一步提供幫助。

(NsJSonSerialization返回id,可以是數組或字典。內容也將是數組或字典)

您的錯誤消息表明songList是字典而不是數組。 檢查數據結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM