Я использую следующий код для других данных JSON, которые он работает, но здесь он дает исключение словаря, у него небольшой объем данных.
Это данные, которые я разбираю
{ "affectedDate": 1310515200000,
"category": "Sport",
"content": "Kl 2100 hver tredje lørdag i måneden arrangerer Harvey's en interaktiv fotballquiz på våre 13 HD-skjermer. Nivået er høyt, men samtidig er det underholdning i form av videoproduksjoner og midt i blinken for enhver fotballinteressert kristiansander. Quizen er myntet på folk som har lyst å lære litt om fotball - og ikke bare de som vet hvor mange fly som gjennomsnittlig flyr over Goodison Park. Det er 1-4 personer pr lag og gratis påmelding i baren på Harvey's eller på tlf 380 72305. Umbro er hovedsponsor av Harvey's Saturday Night Football Quiz og stiller med flotte rundepremier! \n
\ n Vi har også en maratontabell bestående av all resultatene fra 2011s runder, men hvor vi stryker hvert lag sine fire dårligste poengsummer foran final i desember. Laget som vinner sammenlagt sender vi til EM i Polen og Украина neste sommer! \ N \ n Получить более подробную информацию, саундтрек, maratontabell и annen informasjon finner du for øvrig på våre hjemmesider www.harveys.note \ n dette er en månedlig fotballhappening å med seg! "," eventId ": 15946," image ":" http://shelf-media.s3.amazonaws.com/39be3cbc5584eb0e9f61c9926a62d478_gmedium.jpg ",
"latitude": "58.1441382",
"longitude": "7.9933589",
"title": "HARVEY'S SATURDAY NIGHT FOOTBALL QUIZ" }
SBJsonParser *parser = [[SBJsonParser alloc] init];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.krsconnect.no/community/api.html?method=event&appid=620&eventid=15946&affecteddate=1310515200000"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSDictionary *object = [parser objectWithString:json_string error:nil];
appDelegate.books1 = [[NSMutableArray alloc] init];
appDelegate.dates =[[NSMutableArray alloc]init];
appDelegate.descriptionArray=[[NSMutableArray alloc]init];
NSArray *results = [parser objectWithString:json_string error:nil];
NSLog(@"%@", results);
for (int i=0; i<[results count]; i++) {
Detail *aBook = [[Detail alloc] initWithDictionary:[results objectAtIndex:i]];
[appDelegate.descriptionArray addObject:aBook];
[aBook release];
}
3 ответа
Когда я смотрю на настоящую веб-страницу, самая внешняя структура - это «объект» (словарь). Но вы дважды анализируете входную строку, один раз ожидая словарь, а второй раз - массив (не может быть и того, и другого). Я подозреваю, что это массив, к которому вы обращаетесь, когда получаете сообщение об ошибке. (Не могу сказать наверняка, поскольку вы не предоставили никакого журнала или другой информации об ошибках.)
В общем, вам необходимо протестировать (с помощью isKindOfClass
) тип, возвращаемый парсером JSON, чтобы убедиться, что это тот тип, который вы ожидаете.
Detail *aBook = [[Detail alloc] initWithDictionary:[results objectAtIndex:i]];
Вы делаете предположение, что все объекты внутри вашего массива results
являются объектами NSDictionary
- JSON может содержать и словари, и массивы, поэтому это далеко не гарантировано.
Ваша строка JSON содержит словарь в качестве корневого объекта, а не массив, поэтому он инициализируется как NSDictionary
методом objectWithString:
. NSDictionary
не имеет метода objectAtIndex:
, поэтому вы видите исключение при попытке его вызвать.
Похожие вопросы
Новые вопросы
iphone
НЕ ИСПОЛЬЗУЙТЕ этот тег, если вы не обращаетесь конкретно к iPhone и / или iPod touch от Apple. Для вопросов, не зависящих от оборудования, используйте тег [ios]. Больше тегов, которые нужно рассмотреть, это [xcode] (но только если вопрос касается самой IDE), [swift], [target-c] или [cocoa-touch] (но не [cocoa]). Пожалуйста, воздержитесь от вопросов, касающихся iTunes App Store или iTunes Connect. Если вы используете C #, пометьте [mono].