2012-03-21 115 views
0

到目前爲止,我已經在JSON中發現封裝在{}中的所有東西都是對象(objC:NSDictionary),封裝在[]中的任何東西都是數組(objC:NSArray)。在objectiveC(SBJSON)對象和數組中解析JSON

我已閱讀並重新閱讀這篇文章,這個話題> How to parse JSON into Objective C - SBJSON

我有仿照這樣的數據以.json文件:
http://elbee101.com/dummySchedule.json

...現在的驗證碼:

SBJSON *parser = [[SBJSON alloc] init]; 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://elbee101.com/dummySchedule.json"]]; 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 

NSDictionary *schedule = [parser objectWithString:json_string error:nil]; 
NSDictionary *day = [schedule objectForKey:@"day"]; 
NSArray *myList = [day objectForKey:@"name"]; 
NSLog(@"myList %@", myList); 
NSArray *numLaps = [myList objectAtIndex:0]; 
NSLog(@"numlaps%@ ", numLaps); 

我從上面的代碼獲取 「myList中(空)」 和 「numlaps(空)」 @

0!

問題:有人可以請我直接對我的JSON數據的對象和數組的排序嗎?我想鑽取樹,以便我可以訪問'day name','session starttime/endtime/sessionname','numlaps'&'class',但我似乎無法越過'day'對象/數組(?)

+0

如果'SBJson'解析器只是你的問題,那麼請確認你的'schedule'和'day'是否有值(記錄它們並檢查),或者你可以使用'NSJSONSerialization'來改善性能。您是否正在從您的主線程應用程序中執行此操作... – iDroid 2012-03-21 05:37:34

+0

我有一個自定義類來解析任何json文件,因此您需要使用 – 2012-03-21 05:42:57

+0

chiLLer,感謝您的迴應! 'json_string'包含所有數據,'schedule'有1個鍵/值對,'day'有0個鍵/值對。 至於應用程序的主線程,不知道隊友:)我真的正在尋找一個答案,根據其他線程即ie。頂級「時間表是一個對象,日是一個屬性(?)的時間表,名稱是一個數組(?)」等等......我真的在這裏很深,對obj-c編程來說很新! – gokartracer101 2012-03-21 06:55:11

回答

1

你指的是schedule是包含在最外面的{}的對象。試試這個:

NSDictionary *json = [parser objectWithString:json_string error:nil]; 
NSDictionary *schedule = [json objectForKey:@"schedule"]; 

然後像以前一樣繼續。

此外,如果您使用的是iOS 5,則可以使用NSJSONSerialization類 - 使用它幾乎相同,您可能會獲得更好的性能,而且您不必擔心使用第三方第四方庫。

0

調用這個在以往任何時候u需要解析

NSMutableArray *arr=[[NSMutableArray alloc] init]; 
arr=[[Headparse getArrayFromUrl:@"http://elbee101.com/dummySchedule.json"] retain]; 
NSLog(@"%@",[arr description]); 
[arr release]; 

寫這種方法,自定義類使用時你永遠需要

+(NSMutableArray *) getArrayFromUrl: (NSString *)actionType 
{ 
NSMutableData *responseData1= [NSMutableData data] ; 
responseData1 = [NSMutableData dataWithContentsOfURL:[NSURL URLWithString:actionType]]; 
// NSLog(@"%@",responseData1); 
NSString *responseString1 = [[NSString alloc] initWithData:responseData1 encoding:NSUTF8StringEncoding]; 
//NSLog(@"REs:-->%@",responseString1); 
//[responseData1 release]; 
responseData1 = nil; 
NSMutableArray *responseArray = [[NSMutableArray alloc]init]; 
responseArray = (NSMutableArray *)[responseString1 JSONValue]; 
// NSLog(@"ghfchfvghv%@",responseArray); 
[responseString1 release]; 
return responseArray; 
    } 
+0

我檢查過它的工作正常嗎? – 2012-03-21 05:52:23

+0

感謝您的回覆Krishna,Hare Hare!首先我使用的是一個ARC項目,所以我需要刪除'release'引用,然後我刪除了'retain',並且我得到了所有數量的錯誤,例如使用未聲明的標識符「Headparse」。我相信它適用於你,但我不是100%如何解決你的建議?!@ :) – gokartracer101 2012-03-21 07:00:30

+0

headparser是一個類,我用它來調用每次需要解析像自定義類 – 2012-03-21 07:38:03

0

這是我如何使用NSJsonSerialization解析JSON對象。

 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://elbee101.com/dummySchedule.json"]]; 
    NSError *err; 
    NSDictionary* json = [NSJSONSerialization 
          JSONObjectWithData:data 
          options:kNilOptions 
          error:&err]; // 
    NSDictionary *schedule_dict = [json objectForKey:@"schedule"]; 
    NSArray *days = [schedule_dict objectForKey:@"day"];//Days Array from day Object 
    NSDictionary *dayOne = [days objectAtIndex:0]; 
    NSDictionary *dayTwo = [days objectAtIndex:1]; 
    NSLog(@"THE DAY ONE : %@",dayOne); 
    NSLog(@"THE DAY TWO : %@",dayTwo);

希望這可以幫助你.... 注:如果你不想去與NSJsonSerailization(考慮this讀),但仍JSON數據像上面會適用於解析你的情況。