2014-12-18 1 views
0

Итак, последние два дня я пытался получить данные из и в файл JSON, потому что он имеет несколько уровней и одинаковых имен. Я не создал этот файл и не могу изменить структуру, поэтому мне нужно заставить ее работать так, как есть. Для Pharse JSON один уровень не проблема, и он отлично работает, мне нужно, чтобы получить отдельный блок данных от «GOV» и «PRIV», тогда мне нужен блок данных «GENERAL» и «LOCAL» и в тех, которые мне нужны чтобы получить информацию о больнице в виде блока, но также и отдельные значения. Теперь я пытаюсь сделать это в течение двух дней, и я знаю, что я делаю что-то неправильно, но не могу понять это. блок «GOV», но затем в окне вывода отображается массив с данными доступа (< __NSCFArray 0x7fe711f58800>) и вывод ... Я не могу разбить этот вывод, и это то, что мне нужно, потому что каждое значение должно быть в текстовый файл в ячейке tableview.Я знаю, что [} обозначает NSDictionary [] обозначает NSArray, и я много читал о JSON, и я получил концепцию, но есть мало для не понятной мне информации, когда речь идет о многоуровневых JSON и равные имена (больница) в этом случае. Я пробовал все доступные варианты I coul d найти здесь, в StackOverflow, но не успешно. Так что, если кто-нибудь могут толкать меня в правильном направлении, я буду .. часть благодарна кода:Многоуровневое чтение и запись JSON IOS8

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 блока больницы данных, но как массив, и это были я застреваю .. Мне нужно получить еще один уровень глубже ..... Опять решение, вероятно, легко, но 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

Можете ли вы обновить весь JSON без каких-либо изменений на нем? – GoCrazy

+1

Удалите черточки '(-)' из вашего json и воспользуйтесь этим сериализатором json: http://jsonviewer.stack.hu/. Полагаю, вы поймете это лучше. –

+0

[{"hospital": {"area": ​​[{"hospital": [{"hospitalname": "ABC", "avgrating": "2,6", "condition": "UPDATE NEEDED"}, {" hospitalname ":" DEF " "avgrating": "4,2", "состояние": "FINE"}], "имя": "GENERAL"}]}, "название": "GOV"}, {" больница ": {" area ": [{" hospital ": [{" hospitalname ":" GHI "," avgrating ":" 3 "," condition ":" INSTALL NEW "}, {" hospitalname ":" JKL "," «avragating»: «0», «condition»: «NEW»}], «name»: «LOCAL»}]}, «title»: «PRIV»}] – ECKO

ответ

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 

Я не тестировал его. Но я предполагаю, что это сработает. Попробуйте и дайте мне знать, что произойдет.

+0

Спасибо, он работает poerfect, я знал, что это было что-то легкое ...просто не видел – ECKO

+0

Happy Codding .. – GoCrazy

0

Проблема заключается в том, что вам нужно 2 для петель для каждого «Area». Площадь представляет собой массив (1-я петля), и каждая больница представляет собой еще один массив (2-я петля). И внутри каждого больничного элемента есть словарь со значениями, которые вам нужны.

пренебрегая петлю это, как вы получите первый hospitalname (ABC), предполагающее _AppListArray имеет содержание Площади

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

Для каждого 0 вы замените его с прилавками для для петель.

+0

Такой * слепой доступ к объектам в массиве иногда вызывает исключение из-за границы, учитывая меняющийся характер данных, передаваемых извне. Лучше сначала проверить количество массивов и получить к ним второй доступ. – Droppy

+0

Да, вот почему я сказал, что OP должен делать это внутри 2-х-петель. Пример, который я опубликовал, был просто заполнителем. – Aris

Смежные вопросы