【问题标题】:parse JSON in objectiveC (SBJSON) objects and arrays在 Objective C (SB JSON) 对象和数组中解析 JSON
【发布时间】:2012-03-21 05:23:43
【问题描述】:

到目前为止,我在 JSON 中发现 { } 中包含的所有内容都是对象(objC : NSDictionary),而 [ ] 中包含的所有内容都是数组(objC : NSArray)。

我已经阅读并重新阅读了这篇关于该主题的文章> 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 (null)”和“numlaps (null)”?!@

问题:有人可以直接告诉我关于我的 json 数据的对象和数组的顺序吗?我想向下钻取树,以便我可以访问“日期名称”、“会话开始时间/结束时间/会话名称”、“numlaps”和“类”,但我似乎无法超越“日期”对象/数组(?)

【问题讨论】:

  • 如果 SBJson 解析器只是您关心的问题,那么请确认您的 scheduleday 包含其中的值(记录并检查),或者您可以使用 @ 执行相同操作987654327@ 具有改进的性能。您是从应用程序的主线程执行此操作吗...
  • 我有一个自定义类来解析任何 json 文件,所以你需要它
  • chiLLer,感谢您的回复! 'json_string' 包含所有数据,'schedule' 有 1 个键/值对,'day' 有 0 个键/值对。至于应用程序的主线程,不知道队友:) 我真的在寻找另一个线程的答案,即。顶级“日程安排是一个对象,日期是日程安排的一个属性(?),名称是一个数组(?)”等等......我真的很深入,并且对 obj-c 编程非常陌生!跨度>

标签: objective-c json parsing nsdictionary


【解决方案1】:

您所说的schedule 是包含在最外层{} 中的对象。试试这个:

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

然后像以前一样继续。

另外,如果您使用的是 iOS 5,您可以使用 NSJSONSerialization 类——使用它几乎相同,您可能会获得更好的性能,而且您不必担心使用第三方库。

【讨论】:

    【解决方案2】:

    在你需要解析的地方调用它

    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;
        }
    

    【讨论】:

    • 感谢克里希纳的回应,野兔!首先,我使用的是一个 ARC 项目,所以我需要删除“发布”引用,然后我删除了“保留”,我得到了所有错误,例如使用未声明的标识符“Headparse”。我相信它对你有用,但我不是 100% 知道如何处理你的建议?!@ :)
    • headparser 是一个类,我每次都需要像自定义类一样进行解析时调用它
    【解决方案3】:

    这就是我使用 NSJsonSerialization 解析 json 对象的方式。

    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://elbee101.com/dummySchedule.json"]]; NSError *错误; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:数据 选项:kNilOptions 错误:&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(@"第一天:%@",dayOne); NSLog(@"第二天 : %@",dayTwo);

    希望这可能对您有所帮助....注意:如果您不想使用NSJsonSerailization(考虑阅读this),但仍然需要解析json数据,例如以上也适用于您的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多