0

我有一个像这样的 json 结构,我正在尝试检查每个嵌套小部件数组中的“类型”。因此,如果它是某种类型,那么我正在尝试提取淡入淡出步骤、宽度、高度等属性。

有没有办法使用 for 循环来做到这一点?现在我正在这样做:

for (NSString *widgetArray in widgets)
{
    NSLog(@"%@", widgetArray);
}

它打印内容,如何提取相应的值?for(NSDictionary *asset in [assets allValues]) { NSString *type = assets[@"type"];

    if ([type isEqualToString:@"gradient"])
    {
        [gradients addObject:asset];

    }

这是帮助我访问字典内容的成员之一提供的伪代码,我无法将类似的逻辑应用于嵌套数组结构。

4

3 回答 3

0

要检查每个元素的类型,请使用NSObject isKindOfClass:方法。

所以,你可能有类似的东西:

if ([obj isKindOfClass:[NSDictionary class]]) { ... }

或者

if ([obj isKindOfClass:[NSArray class]]) { ... }

就像@H2CO3 说的,你objectAtIndex:用来访问数组元素和objectForKey:访问字典元素。

编辑:我刚刚意识到,“某种类型”的 OP 是指“类型”字段的值,而不是条目的objective-c 类。不过,在读取 JSON 数据以确定条目是数组还是字典时,它通常很有用,所以我将在此处留下答案。

于 2013-02-11T18:22:49.407 回答
0

在最新的目标 C 中,您可以像 C 数组一样使用下标。例如,

NSLog(@"%@", widgetArray[i]);

对于字典,您可以通过键提取:

NSString* id = myDict[@"id"];
于 2013-02-11T18:24:09.877 回答
0

由于问题是递归搜索,因此您必须使用stack。以下是步骤:

  1. 创建NSMutableArray将用作堆栈。现在它是空的。
  2. 取出根widgets数组并将其所有对象放入堆栈 ( -addObjectsFromArray:)。
  3. 取出NSDictionary堆栈中的第一个小部件 ( )。将其存储在变量中后,请务必将其从堆栈( -removeObjectAtIndex:)中取出。
  4. 用那个变量做你的type比较和其他事情。
  5. 就像在步骤 2 中一样,取出它的子小部件并将它们全部放入堆栈。
  6. 如果堆栈中有东西,从第 3 步开始重复。否则,您处理了所有小部件。

伪代码:

// 1
NSMutableArray *stack = [NSMutableArray array];
// 2
[stack addObjectsFromArray:rootWidgets];
while (stack.count > 0) {
    // 3
    NSDictionary *widgetDict = [stack objectAtIndex:0];
    [stack removeObjectAtIndex:0];
    // 4
    if ([[widgetDict objectForKey:@"type"] isEqualToString:...]) // Do whatever...
    // 5
    [stack addObjectsFromArray:[widgetDict objectForKey:@"widgets"]];
}
// 6
// You are done...
于 2013-02-11T19:59:27.967 回答