Я использую следующий код для других данных 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];  
}
0
ali 25 Авг 2011 в 15:07

3 ответа

Лучший ответ

Когда я смотрю на настоящую веб-страницу, самая внешняя структура - это «объект» (словарь). Но вы дважды анализируете входную строку, один раз ожидая словарь, а второй раз - массив (не может быть и того, и другого). Я подозреваю, что это массив, к которому вы обращаетесь, когда получаете сообщение об ошибке. (Не могу сказать наверняка, поскольку вы не предоставили никакого журнала или другой информации об ошибках.)

В общем, вам необходимо протестировать (с помощью isKindOfClass) тип, возвращаемый парсером JSON, чтобы убедиться, что это тот тип, который вы ожидаете.

1
Hot Licks 25 Авг 2011 в 11:36
    Detail  *aBook = [[Detail alloc] initWithDictionary:[results objectAtIndex:i]];

Вы делаете предположение, что все объекты внутри вашего массива results являются объектами NSDictionary - JSON может содержать и словари, и массивы, поэтому это далеко не гарантировано.

0
lxt 25 Авг 2011 в 11:10

Ваша строка JSON содержит словарь в качестве корневого объекта, а не массив, поэтому он инициализируется как NSDictionary методом objectWithString:. NSDictionary не имеет метода objectAtIndex:, поэтому вы видите исключение при попытке его вызвать.

0
omz 25 Авг 2011 в 11:52