2012-10-18 84 views
7

以下語句是正確的,還是我錯過了某些內容?從NSJSONSerialization返回的對象可能會有所不同

你必須檢查的NSJSONSerialization返回的對象,看它是否是一個字典或數組 - 你可以有

data = {"name":"joe", "age":"young"} 
// NSJSONSerialization returns a dictionary 

data = {{"name":"joe", "age":"young"}, 
    {"name":"fred", "age":"not so young"}} 
// returns an array 

每種類型都有不同的訪問方法,如果使用錯誤的話會中斷。 例如:

NSMutableArray *jsonObject = [json objectAtIndex:i]; 
// will break if json is a dictionary 

所以你必須做這樣的事情 -

id jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData 
     options:NSJSONReadingMutableContainers error:&error]; 

    if ([jsonObjects isKindOfClass:[NSArray class]]) 
     NSLog(@"yes we got an Array"); // cycle thru the array elements 
    else if ([jsonObjects isKindOfClass:[NSDictionary class]]) 
     NSLog(@"yes we got an dictionary"); // cycle thru the dictionary elements 
    else 
      NSLog(@"neither array nor dictionary!"); 

我有一個很好看通堆棧溢出和蘋果文檔和其他地方,找不到上述任何直接確認。

+0

你沒有提到你的代碼出現了什麼問題。 –

+0

問題是,如果您返回字典並使用數組方法訪問它,則會引發異常。我認爲你需要檢查返回對象類型來解決這個問題,但是要確認這是正確的方法。 – user1705452

回答

5

如果您只是在問這是否正確,是的,這是處理jsonObjects的安全方法。這也是你如何與其他API返回id

+0

好的 - 謝謝你 - 關於使用NSJSONSerialization並且不檢查返回類型(或者總是假定它不可變)有很多問題(對我來說)是一個微妙的陷阱。這篇文章的目的是確認和澄清。 – user1705452