objective-c - NSDictionary objectForKey 返回值

标签 objective-c json parsing nsarray nsdictionary

我正在使用 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/

相关文章:

ios - 使用 UINavigationController 在 UIPageViewController 中下推内容

ios - 滚动时 UITableView 内容重置

android - Gson - 相同的字段名称,不同的类型

javascript - 使用 lodash 将 JSON 转换为对象数组

java - 解析字符串以忽略空格时出错,计算器类

java - Android 解析字符串中的引号

iphone - UIScrollView通知?

iphone - 从单词对象的 NSMutableArray 中创建一个干净的单词 NSString,然后用于搜索

sql - 在SQL中更新JSON数组中的现有JSON值

c# - 解析 BigInteger 时出现 FormatException