2011-01-30 75 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