我正在使用 json-framework 从 JSON 响应中创建一个 NSDictionary。这么多的工作非常好。
现在,在这个 JSON 负载中有一个或多个对象——我们称它们为 X。在 XML 中有点像这样:
<OBJECTS>
<X>
...
</x>
<X>
...
</X>
<X>
...
</X>
</OBJECTS>
当我查看前面提到的所有 X 的 NSDictionary 对象时,如下所示:
NSDictionary *results = [[dict objectForKey:@"OBJECTS"] objectForKey:@"X"];
甚至:
NSDictionary *results = [dict valueForKeyPath:@"OBJECTS.X"];
根据 gdb,我得到了 NSDictionary 对象的 NSCFArray。 (是的,我在这里也闻到了一些有趣的味道,但稍后会详细介绍。)
当只有 一个 对象名为 X 时,我会返回一个真实的 NSDictionary。
那么...无论有多少个 X,我应该怎么做才能使其行为一致?
乍一看,我认为我只是将结果更改为 NSArray *,但是当我想快速枚举结果时会发生什么?现在我这样做:
for (NSDictionary *result in results)
在 NSCFArray 的情况下(多个 X),我为每个 X 取回了一个单独的 NSDictionary。在单个 X 的情况下,我取回了一个 NSDictionary,除了现在我的观点太深了一层。换句话说,而不是这个(人为的例子):
(gdb) po results
<NSCFArray 0xd4a940>(
{
foo = {
bar = "something";
};
}
{
foo = {
bar = "something else";
};
}
)
我明白了:
(gdb) po results
{
foo = {
bar = "something";
};
}
线索欢迎/赞赏!您甚至可能会问是否有必要将其分开,但现在让我们假设此行确实是必要的。 (不过,如果有人对此有足够强烈的感觉,我很乐意被说服。)
最终,在一天结束时,我想要一个 NSDictionary 对象的 NSArray。
最佳答案
我不熟悉 JSON 或 json 框架,但显然 objectForKey 不能用于访问 X,因为它们都具有相同的 key 。
如果您知道 objectForKey:@"OBJECTS"将返回一个 NSDictionary(单个元素)或一个 NSDictionary 的 NSArray(多个 X 元素),那么您可以这样做:
if ( ![results isKindOfClass:[NSArray class]] ) {
results =[NSArray arrayWithObject:results];
}
假设您确切了解 json 框架的行为方式,这将为您提供一致的结果。它会有些脆弱,如果元素返回一个条目数组而不是 NSDitionary 那么它就会分崩离析。
json-framework 可能有一个配置设置,可以让您控制它在这种情况下的行为方式,这将是更可取的。
关于objective-c - NSDictionary objectForKey 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1025389/