Как пройти многомерный NSArray? - PullRequest
1 голос
/ 30 января 2011

У меня есть массив из ответа JSON.

NSLog(@"%@", arrayFromString) дает следующее:

{meta = {code = 200;};response = {groups = ({items = ({Categories = ({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 ]

1 голос
/ 30 января 2011

Во-первых, структура данных, которую вы возвращаете из анализатора JSON, - это не массив, а словарь: { key = value; ... } (фигурные скобки).

Во-вторых, если вы хотите получить доступ к вложенной структуре, такой как элементы, вам нужно использовать метод valueForKeyPath: NSObject. Это вернет массив всех элементов в вашей структуре данных:

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

Обратите внимание, что вы потеряете представление о группах при извлечении таких объектов, как этот.

1 голос
/ 30 января 2011

Глядя на отправленную вами строку JSON, response.groups.items выглядит как массив, содержащий один элемент, карту / словарь, содержащий один ключ, «категории». Выход его в строку будет проходить через все дерево, но чтобы получить к нему программный доступ, вы должны сами пройтись по дереву. Не видя более полного примера JSON, трудно сказать, что именно нужно сделать здесь.

EDIT:

Обойти такой граф объектов не так просто; Есть несколько разных подходов (сначала глубина, ширина и т. д.), поэтому это не обязательно то, для чего вам нужен простой API. Я не уверен, что это та же библиотека JSON, которую вы используете, но, например, это код из библиотеки JSON, который выполняет работу по генерации строки, которую вы видите , Как вы можете видеть, это немного запутанно - конечно, не однострочник или что-то в этом роде.

Вы можете попробовать это, которое я представляю без тестирования или гарантии:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...