所以最近两天我一直在努力从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"
}
]
答案 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
我还没有测试过。但我认为这会奏效。试一试,让我知道会发生什么。