我正在通过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;
答案 0 :(得分:1)
与Java(和类似语言)不同,Obj-C中没有运行时类型检查。
如果您的方法返回NSArray
并将其存储到NSDictionary
,则对于Obj-C来说这不是问题。在您尝试调用未为NSArray
定义的方法之前(例如objectForKey:
)。
通常,这些问题应该在编译时才能解决,但是
+[NSJSONSerialization JSONObjectWithData:...]
会返回id
(它可以返回NSArray
或NSDictionary
),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;
您可能希望进行更多处理,但这至少可以确保您永远不会访问错误的对象类型。