2012-03-21 114 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数据像上面会适用于解析你的情况。