Как пройти через файл JSON в Какао? - PullRequest
0 голосов
/ 24 мая 2011

Эй, Гас, я знаю, что подобные вопросы уже есть, но никто не отвечает на мой вопрос специально.

В основном я использую небольшой файл JSON в качестве базы данных, например:

{
"dataBase" : [
  {"version" : "0.1", "creator" : "unknown", "creationDate" : "2011-05-22 21:29:11 +0200"}],

"clients" : [
{"id" : "0", "name" : "customer1"},
{"id" : "1", "name" : "customer2", "projects" : [
    {"id" : "0", "name" : "project1", "timestamps" : [
        {"id" : "0", "start" : "2011-05-21 21:29:11 +0200", "stop" : "2011-05-22 21:29:11 +0200"},
        {"id" : "1", "start" : "2011-05-21 21:29:11 +0200", "stop" : "2011-05-22 21:29:11 +0200"},
        {"id" : "2", "start" : "2011-05-21 21:29:11 +0200", "stop" : "2011-05-22 21:29:11 +0200"}
    ]},
    {"id" : "0", "name" : "project2", "timestamps" : [
        {"id" : "0", "start" : "2011-05-21 21:29:11 +0200", "stop" : "2011-05-22 21:29:11 +0200"},
        {"id" : "1", "start" : "2011-05-21 21:29:11 +0200", "stop" : "2011-05-22 21:29:11 +0200"},
        {"id" : "2", "start" : "2011-05-21 21:29:11 +0200", "stop" : "2011-05-22 21:29:11 +0200"}
    ]}             
  ]}
]}

Я анализируюJSON с YAJL Framework выглядит так:

yajl = [json yajl_JSON];

yajl объявляется в заголовке как NSDictionary

Если я спрашиваю:

NSLog(@"creator Name: %@" ,[[yajl objectForKey:@"dataBase"] valueForKey:@"creator"]);

, я получаю это:

2011-05-24 00: 31: 36.887 YAJLParser [1800: 903] Имя создателя: («неизвестно»)

Поскольку я не знаю, как обращаться с этими скобками, то япотеряно, но это лишь малая часть проблемы.

Мой вопрос: как мне получить доступ, скажем, ко всем временным меткам для customer2 project2?Я перепробовал все, что нашел при поиске на форумах, но не смог найти что-то, что (я правильно настроил) сработало для меня ...

Заранее спасибо !!!

1 Ответ

0 голосов
/ 24 мая 2011

Просмотрите определение формата здесь . Вы обнаружите, что [yajl objectForKey:@"dataBase"] содержит массив одного элемента, и в этом первом элементе есть ключ creator.

[[[yajl objectForKey:@"dataBase"] objectAtIndex:0] valueForKey:@"creator"] должно вернуть правильное значение. Точно так же обход для клиентской части будет

NSArray *clients = [yajl objectForKey:@"clients"];
for (id client in clients) {
    NSArray *projects = (NSArray *)[client objectForKey:@"projects"];
    for (id project in projects) {
        NSArray *timestamps = (NSArray *)[project objectForKey:@"timestamps"];
        for (id timestamp in timestamps) {
            ...
        }
    }
}

Это для доступа к метке времени проекта2 -

id timestamp = [[[[yajl objectForKey:@"clients"] objectAtIndex:1] objectForKey:@"timestamps"] objectAtIndex:1];

NSLog(@"%@ %@",[timestamp valueForKey:@"start"], [timestamp valueForKey:@"stop"]);
...