如何在Cocoa中浏览JSON文件?
嘿,格斯,我知道已经有类似的问题了,虽然没有人专门回答我的问题 基本上,我使用一个小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
{
"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”]
包含一个项目数组,在第一个项目中有keycreator
[[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的原理…