2011-05-23 51 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