В приведенном вами примере JSON нет массива.
Итак, в этой строке:
NSArray *universityArray = [[dict objectForKey:@"Università"] objectForKey:@"uniID"];
Если вы предполагаете, что выводом является массив, в действительности это словарь.
Если вы поместите оператор log, выводящий тип класса, возвращаемого после этой строки:
NSLog(@"Kind of class returned from univeristyArray = %@", [universityArray class]);
Он вернет:
Kind of class returned from univeristyArray = __NSDictionaryI
Прямо сейчас ваша структураПример JSON, который вы опубликовали:
Top Level Object (Dictionary)
"Università" (Dictionary)
"uniID" (Dictionary)
Другая проблема с этой структурой состоит в том, что у вас есть несколько значений для одного и того же ключа в словаре "Università" (то есть несколько "uniID", которые имеют различные связанные значения)
Если у вас есть контроль над сгенерированным JSON, у вас есть несколько различных опций в зависимости от того, что вы пытаетесь сделать:
- Из вашего кода это выглядит так, как будто вы пытаетесьперебрать все "Università" и вывести их имя - и вы ожидаете, что они будут храниться в массиве. В этом случае вы захотите изменить структуру данных "Università" на Array в JSON.
- В качестве альтернативы, сделайте "nome" значение университета ключом для словарей более низкого уровня, а затем извлекайте ихпо имени (только если названия университетов будут уникальными) - было бы хорошо, если у вас большой список университетов и вы пытаетесь выбрать только определенные университеты (по имени).
Пример # 1:
university.json:
{
"Università" : [
{
"latitudine" : 43.115441,
"longitudine" : 12.389587,
"nome" : "Università per stranieri di Perugia",
"regione" : "Umbria"
},
{
"latitudine" : 41.860348,
"longitudine" : 12.496308,
"nome" : "Università degli Studi Internazionali di Roma ( UNINT )",
"regione" : "Lazio"
},
]
}
setupUniversityLocation:
-(void)setupUniversityLocation {
NSDictionary *dict = [self JSONUniversity];
NSArray *universityArray = [dict objectForKey:@"Università"];
for (NSDictionary *uni in universityArray) {
NSString *uniname = [uni objectForKey:@"nome"];
NSLog(@"uniname %@",uniname);
}
}
Пример # 2:
университет. json:
{
"Università" : {
"Università per stranieri di Perugia": {
"latitudine" : 43.115441,
"longitudine" : 12.389587,
"regione" : "Umbria"
},
"Università degli Studi Internazionali di Roma ( UNINT )": {
"latitudine" : 41.860348,
"longitudine" : 12.496308,
"regione" : "Lazio"
},
}
}
setupUniversityLocation:
-(void)setupUniversityLocation {
NSDictionary *dict = [self JSONUniversity];
NSDictionary *universityDictionary = [dict objectForKey:@"Università"];
// this is an example of looping through the entire dictionary
// typically you'd use objectForKey when accessing a specific university
for (NSString *universityNameKey in universityDictionary.allKeys) {
NSDictionary *specificUniDictionary = [universityDictionary objectForKey:universityNameKey];
NSLog(@"uniname %@",universityNameKey);
NSLog(@"latitudine %@", [specificUniDictionary objectForKey:@"latitudine"]);
NSLog(@"longitudine %@", [specificUniDictionary objectForKey:@"longitudine"]);
}
}
В большинстве случаев я бы порекомендовал перейти ко второму варианту, так как если это большой список, то будет гораздо быстрее найти конкретныйпункт, но это определенно зависит от вашего варианта использования.