多级JSON读写IOS8

时间:2014-12-18 09:53:46

标签: ios objective-c json ios8 multi-level

所以最近两天我一直在努力从JSON文件获取数据,这是因为它有多个级别和相同的名称。我没有设置这个文件,也无法改变结构,所以我必须让它以它的方式工作。对于Pharse JSON表单单个级别没有问题,它工作正常,我需要的是从" GOV"中获取单独的数据块。和" PRIV"然后我需要一个数据块" GENERAL"和" LOCAL"在那些我需要能够获得"医院信息作为块,但也需要单独的值。现在我一直试图让这两天完成,我知道我做错了什么但是无法弄明白。我确实得到了数据,例如" GOV"块然后在输出窗口显示一个带访问数据的数组(< __ NSCFArray 0x7fe711f58800>)和输出...我不能分解这个输出,这就是我需要的,因为每个值都需要在一个文本文件中在tableview单元格中。我知道{}表示NSDictionary []表示NSArray并且我已经阅读了很多关于JSON的内容并且我得到了概念但是在这种情况下,当谈到多级JSON和同等名称(医院)时,对我来说几乎没有可理解的信息。我已经尝试了我在StackOverflow上找到的所有可用选项,但没有成功。因此,如果有人能以正确的方式推动我,我将感激不尽..部分代码:

NSURL *url = [NSURL URLWithString:getDataURL];
NSData * data = [NSData dataWithContentsOfURL:url];

_jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

_AppListArray = [[NSMutableArray alloc] init];


NSArray *wrapper= [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSDictionary *avatars = [wrapper objectAtIndex:0];




for(NSDictionary *apps in _jsonArray) {
    if([[apps objectForKey:@"title"] isEqualToString:@"GOV"]){
       NSDictionary*tmp = [apps objectForKey:@"hospital"];
        _AppListArray = [tmp objectForKey:@"area"];
    }
}

//returns error because _ApplistArray is an array and it can't read the data from the objectkey  
for (int i = 0;  i < _jsonArray.count; i++)
{
    NSString *appName = [[_AppListArray objectAtIndex:i] objectForKey:@"hospitalname"];
    NSString *appCondition = [[_AppListArray objectAtIndex:i] objectForKey:@"condition"];
    NSString *app avgrating = [[_AppListArray objectAtIndex:i] objectForKey:@"avgrating"];


    [_AppListArray addObject:[[Applist alloc]initWithAppName:appName andAppCondition:appCondition andAppURL:appURL]];

}

_ApplistArray会返回1ste Hospital数据块,但是作为一个数组,这就是我被卡住了......我需要更深层次......再次解决方案可能很简单但是JSON是我从未工作过的这是我的第一次去。我需要从中获取数据的JSON:

[


-{
    -hospital: {
            -area: [
                 -{
                     -hospital: [
                                 -{
                                 hospitalname: "ABC",
                                 avgrating: "2,6",
                                 condition: "UPDATE NEEDED",
                                 },
                                 -{
                                 hospitalname: "DEF",
                                 avgrating: "4,2",
                                 condition: "FINE",
                                 },
                                 ],
                 name: "GENERAL"
                 }
                 ]
     },
    title: "GOV"
 },
  -{
     -hospital: {
            -area: [
                 -{
                     -hospital: [
                            -{
                                hospitalname: "GHI",
                                avgrating: "3",
                                condition: "INSTALL NEW",
                                },
                                -{
                                hospitalname: "JKL",
                                avgrating: "0",
                                condition: "NEW",
                                },
                                 ],
                 name: "LOCAL"
                 }
                    ]
     },
    title: "PRIV"
 }
]

2 个答案:

答案 0 :(得分:0)

问题是每个“区域”需要2个for循环。 Area是一个Array(第一个循环),每个医院是另一个Array(第二个循环)。 在每个医院元素内部都是具有您需要的值的字典。

忽略循环这是你获得第一个医院名称(ABC)的方式,假设_AppListArray具有Area

的内容
NSString *appName = _AppListArray[0][@"hospital"][0][@"hospitalname"];

对于每个0,您将用for循环的计数器替换它。

答案 1 :(得分:0)

你走了。

NSArray *hospitals = [jsonArray objectForKey:@"mainKey"];// I assumed you getting with some key but change based on your requirement
for (NSDictionary *mainData in hospitals){ // Start of Main Hospital
    NSDictionary *hospital = [mainData objectForKey:@"hospital"];
    NSArray *areas = [hospital objectForKey:@"area"];
    for(NSDictionary *area in areas){// Start of Area
        NSArray *innerHospitals = [area objectForKey:@"hospital"];
        for(NSDictionary *innerHospital in innerHospitals){
            NSString *hospitalName = [innerHospital objectForKey:@"hospitalname"];
            NSString *avgrating =[innerHospital objectForKey:@"avgrating"];
            NSString *condition =[innerHospital objectForKey:@"condition"];
            // Do What Ever you want here
        }
        NSString *name =[area objectForKey:@"name"];

    }// End Of Area
    NSString *title =[mainData objectForKey:@"title"];

} // End of Main Hospital

我还没有测试过。但我认为这会奏效。试一试,让我知道会发生什么。