2012-10-18 54 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