2011-01-30 72 views
1

我有数组由JSON响应。如何遍历多维NSArray?

NSLog(@"%@", arrayFromString)给出以下:

{ 元= { 代码= 200; }; 响应= { 组=( { 项=( { 类别=( { 图标= “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"]); 
    } 

回答

1

首先,你从JSON解析器回的数据结构不是一个数组而是一个字典:{ key = value; ... }(大括号)。其次,如果你想访问像项目这样的嵌套结构,你需要使用NSObject的valueForKeyPath:方法。这将返回数据结构中所有项目的数组:

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

请注意,当检索像这样的项目对象时,您将忽略组的概念。

1

看着你张贴的JSON字符串,response.groups.items看起来是包含一个项目的数组,包含一个键的地图/词典“类别”。记录到一个字符串将遍历整个树,但要以编程方式访问它,必须自己走树。没有看到更完整的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); 
} 
+0

感谢您的回复!我正在寻找遍历这种NSArray树的常用方法。也许一些教程?我无法找到任何 – Max 2011-01-30 15:39:52

+0

我已经编辑了我的答案,并提供了一个我可以想到的最简单的例子,以及指向这个“真实”实现的链接。希望能帮助到你! – ipmcc 2011-01-30 18:13:14