如何遍历多维NSArray?

时间:2011-01-30 13:24:14

标签: objective-c cocoa nsarray

我有来自JSON响应的数组。

NSLog(@"%@", arrayFromString)提供以下内容:

  

{           meta = {               代码= 200;           };           response = {               组=(                               {                       items =(                                               {                               类别=(                                                               {                                       icon =   “http://foursquare.com/img/categories/parks_outdoors/default.png”;                                       id = 4bf58dd8d48988d163941735;

依旧......

此代码

NSArray *arr = [NSArray arrayWithObject:[arrayFromString valueForKeyPath:@"response.groups.items"]];

给数组提供了一个我无法迭代的元素。但是,如果我使用NSLog写出来,我可以看到它的所有元素。

最后,我希望有一个项目数组,我可以迭代为我的iPhone应用程序构建表视图的数据源。

我将如何做到这一点?

编辑:

我通过从嵌套数组中获取值来解决了我的问题(objectAtIndex:0):

for(NSDictionary *ar in [[arrayFromString valueForKeyPath:@"response.groups.items"] objectAtIndex:0]) {
        NSLog(@"Array: %@", [ar objectForKey:@"name"]);
    }

2 个答案:

答案 0 :(得分:1)

查看您发布的JSON字符串,response.groups.items看起来是一个包含一个项目的数组,一个包含一个键的地图/字典“categories”。将其记录到字符串将遍历整个树,但要以编程方式访问它,您必须自己走树。如果没有看到更完整的JSON示例,很难确切地知道正确的做法是在这里做什么。

编辑:

遍历这样的对象图并不那么简单;有多种不同的方法(深度优先,广度优先等),所以它不一定是一个简单的API供您使用。我不确定这是否与您正在使用的JSON库相同,但是,例如,来自JSON库的this is the code,它执行生成您正在看到的字符串的工作。正如你所看到的,它有点涉及 - 当然不是单行或任何东西。

你可以尝试这个,我在没有测试或保修的情况下出现:

void __Traverse(id object, NSUInteger depth)
{
    NSMutableString* indent = [NSMutableString string];

    for (NSUInteger i = 0; i < depth; i++) [indent appendString: @"\t"];

    id nextObject = nil;

    if ([object isKindOfClass: [NSDictionary class]])
    {
        NSLog(@"%@Dictionary {", indent);
        NSEnumerator* keys = [(NSDictionary*)object keyEnumerator];

        while (nextObject = [keys nextObject])
        {
            NSLog(@"%@\tKey: %@ Value: ", indent, nextObject);
            __Traverse([(NSDictionary*)object objectForKey: nextObject], depth+1);
        }
        NSLog(@"%@}", indent);
    }
    else if ([object isKindOfClass: [NSArray class]])
    {
        NSEnumerator* objects = [(NSArray*)object objectEnumerator];
        NSLog(@"%@Array (", indent);
        while (nextObject = [objects nextObject])
        {
            __Traverse(nextObject, depth+1);
        }        
        NSLog(@"%@)", indent);
    }
    else 
    {
        NSLog(@"%@%@",indent, object);
    }
}

void Traverse(id object)
{
    __Traverse(object, 0);
}

答案 1 :(得分:1)

首先,从JSON解析器返回的数据结构不是数组而是字典:{ key = value; ... }(花括号)。

其次,如果要访问类似项的嵌套结构,则需要使用NSObject的valueForKeyPath:方法。这将返回数据结构中所有项目的数组:

NSLog(@"items: %@", [arrayFromString valueForKeyPath:@"response.groups.items"]);

请注意,在检索此类项目对象时,您将忽略组的概念。