NSArray作为NSDictionary处理

时间:2014-05-08 18:28:30

标签: objective-c json

我正在通过objective-c app对我的网络服务器进行HTTP调用。返回json的服务器通常如下所示:

{
  "name": "test",
  "surname": "test",
}

但有时候,当我要求列出某些内容时,我会得到这样的JSON:

[
  { "name": "test" },
  { "name": "test" },
]

现在,我以这种方式将返回的对象作为NSDictionary处理:

NSDictionary *results = [http doRequestWithData:@{ @"tag": @"whatever" } atUrl:@"/search"]
NSLog(@"%@", results);

为简单起见,我省略了doRequestWithData的实现,因为有趣的部分是当我执行NSLog数据时,我得到以下内容:

(
        {
        "_id" = 5353c332339a5ea32e000008;
        content = "i am the first search result";
    },
        {
        "_id" = 5353c32b339a5ea32e000007;
        content = "I am the second";
    },
        {
        "_id" = 5353c31c339a5ea32e000006;
        content = "third";
    },
)

任何人都可以解释这是怎么发生的吗?返回的数据是一个NSDictionary,但是从控制台看起来就像一个数组,因为我看不到键!


更新:我在我的http类中使用NSJSONSerialization来序列化对象。文档说它可能会返回基于数据的字典或数组。但问题是我明确将其定义为NSDictionary!难道这至少不会抛出错误吗? 这是我在我的http类中用来定义返回的nsdictionary:

NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
return responseDict;

2 个答案:

答案 0 :(得分:1)

与Java(和类似语言)不同,Obj-C中没有运行时类型检查。

如果您的方法返回NSArray并将其存储到NSDictionary,则对于Obj-C来说这不是问题。在您尝试调用未为NSArray定义的方法之前(例如objectForKey:)。

通常,这些问题应该在编译时才能解决,但是

+[NSJSONSerialization JSONObjectWithData:...]会返回id(它可以返回NSArrayNSDictionary),id与任何类型都兼容。

答案 1 :(得分:0)

最好的办法是使用isKindOfClass:对返回的值进行自己的类型检查。

NSData *data = ...;

NSError *__autoreleasing jsonError;
NSDictionary *dictionary = data ? [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError] : nil;

if (jsonError || ![dictionary isKindOfClass:[NSDictionary class]])
    dictionary = nil;

您可能希望进行更多处理,但这至少可以确保您永远不会访问错误的对象类型。