如何在Cocoa中浏览JSON文件?

如何在Cocoa中浏览JSON文件?,cocoa,json,nsdictionary,Cocoa,Json,Nsdictionary,嘿,格斯,我知道已经有类似的问题了,虽然没有人专门回答我的问题 基本上,我使用一个小JSON文件作为数据库,如下所示: { "dataBase" : [ {"version" : "0.1", "creator" : "unknown", "creationDate" : "2011-05-22 21:29:11 +0200"}], "clients" : [ {"id" : "0", "name" : "customer1"}, {"id" : "1", "name" : "custom

嘿,格斯,我知道已经有类似的问题了,虽然没有人专门回答我的问题

基本上,我使用一个小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"}
    ]}             
  ]}
]}
我使用YAJL框架解析JSON,如下所示:

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的所有时间戳? 我尝试了所有我能找到的搜索论坛,但我找不到(我设置正确)对我有用的东西


提前感谢

浏览格式定义。您会发现
[yajl objectForKey:@“dataBase”]
包含一个项目数组,在第一个项目中有key
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) {
            ...
        }
    }
}
这是为了访问project2时间戳2–

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

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

其次是
valueForKey:
s应该是
objectForKey:
。另一方面,您可以使用
valueForKeyPath:
;例如,
[yajl-valueForKeyPath:@“clients.name”]
将为所有客户端提供一个“name”项数组,
[yajl-valueForKeyPath:@“clients@max.id”]
将为您提供最高使用id。有关更多信息,请参阅。感谢您的快速回复……不幸的是,它不起作用……我得到(null)(null)对于更糟糕的NSLog,我突然得到了类似警告:找不到目标文件“/Users/gabe/Projects/YAJL ObjC/Project/build/YAJL.build/Release/YAJL.build/Objects normal/x86_64/YAJL_gen.o”-没有针对“/Users/gabe/Projects/YAJL ObjC/Project//YAJL-1.0.11/YAJL_gen.c”的调试信息。在控制台中,即使我删除粘贴的代码,它也会留在那里……是XCode4吗?我还可以尝试访问什么?我从头开始重写了数据源,现在它可以工作了。objectForKey是正确的访问对象。任何想做类似事情的人,我建议不要在JSON中使用数组,因为索引几乎破坏了KVC的原理…