2011-05-23 76 views
0

嘿古斯我知道有类似的问题已经存在,但没有回答我的问题具体。如何浏览Cocoa中的JSON文件?

基本上我用一个小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框架,像这样:

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的所有时间戳? 我尝试了一切,我会找到搜索论坛,但我找不到(我安装正确)没有为我工作...

在此先感谢!

回答

0

通过格式定义here。您会发现[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 timestamp2 -

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

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

和辅助件事:'valueForKey:单曲应该是'objectForKey:'。另一方面,你也许可以使用'valueForKeyPath:';例如,'[yajl valueForKeyPath:@“clients.name”]'会为您提供所有客户端的“名称”条目数组,并且'[yajl valueForKeyPath:@“clients。@ max.id”]'将给出你使用的ID最高。有关更多信息,请参阅[KVO编程指南中的集合运算符](http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueCoding/Articles/CollectionOperators.html)。 – 2011-05-23 23:16:34

+0

感谢都非常快回复... 不幸的是简化版,工作... 我得到了的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 /项目/../ yajl-1.0.11/yajl_gen.c”。 在控制台,即使我删除粘贴代码停留在那里... 它是XCode4? 我还有什么可以尝试访问? – bnassler 2011-05-23 23:54:46

+0

我从头开始重写了dataSource,它现在可以工作。 objectForKey是正确的访问。 任何想做类似事情的人,我建议不要在JSON中使用数组,因为这个索引几乎破坏了KVC的原理...... – bnassler 2011-05-24 21:10:09