Получение ошибки при синтаксическом анализе JSON в iphone

#iphone #objective-c #json

#iPhone #objective-c #json

Вопрос:

Я пытаюсь проанализировать данные json и отобразить в таблице мои данные JSON следующим образом

 {"isError":false,"ErrorMessage":"","Result":{"Count":4,"Data":[{"ContentID":"127_30_1309793318065","ContentTypeID":1,"UserCaption":"Gandhinagar(Kanjurmarg)","UserComment":"centraln","DateRecorded":"/Date(1309793318000 0530)/","Data":"","ShareType":true,"Views":0,"PlayTime},{},{},{}];};isError = 0;}
  

Я делаю это так

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{      
    NSString *loginStatus = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",loginStatus);  



    //this is for the getting the data from the server with help of JSON
    NSString *json_string = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding]; 
    NSDictionary *result = [json_string JSONValue];
    /
    //this for holding the Array value which come from the server 
    NSMutableArray *results = [[NSMutableArray alloc] init];
    for (int index = 0; index<[reviewsvalues count]; index  )
    {
        NSMutableDictionary * value = [reviewsvalues objectAtIndex:index];
        ReviewsResult * result = [[ReviewsResult alloc] init];
        result.User_Caption = [value objectForKey:@"UserCaption"];
        result.ContentType_Id = [value objectForKey:@"DateRecorded"];
        result.Average_Rating = [value objectForKey:@"AverageRating"];
        //OVER here MY APP GET CRASH 


    }


} 
  

Но это приводит к сбою и выдает ошибку

[__NSCFDictionary objectAtIndex:]: нераспознанный селектор, отправленный экземпляру

Ответ №1:

Проблема проста.

reviewsvalues должен быть NSDictionary, и вы не должны вызывать objectAtIndex: reviewsvalues .

Вместо этого вы должны вызвать valueForKey like

 int count = [[reviewsvalues valueForKey:@"Count"] intValue];
NSArray *reviewsArray = [reviewsvalues valueForKey:@"Data"];
int count = [reviewsArray count];

cell.textLabel.text = [[reviewsArray objectAtIndex:indexPath.row] valueForKey:@"ContentID"];
  

Надеюсь, это вам поможет.

Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь по этому вопросу.

Комментарии:

1. Да, вы правы, но сделано так: NSArray *reviewsArray = [reviewsvalues valueForKey:@»Data»]; но? как я могу установить значение для ячейки и как можно подсчитать строку

2. @Harish: reviewArray в каждом его индексе содержит словарь.

3. Можете ли вы зайти в онлайн-чат в stackchat

4. @Harish: я отредактировал свой ответ и дал больше кода о том, как вам нужно это сделать. Надеюсь, это поможет. Если у вас все еще есть сомнения, пожалуйста, дайте мне знать

5. @Harish: Не могли бы вы подождать полчаса для участия в stackchat?

Ответ №2:

Вы устанавливаете reviewsvalues = [result objectForKey:@"Result"];

Что означает reviewsvalues , что теперь NSDictionary . «Результат» — это словарь, а не массив:

 {"Count":4,"Data":[...]}
  

NSDictionary не отвечает -objectAtIndex: , это один из NSArray методов.

Вам нужен еще один шаг:

 NSArray *reviewsArray = [reviewsvalues objectForKey:@"Data"];
  

и пока вы этим занимаетесь, вы можете использовать быстрое перечисление.

 for (NSDictionary *review in reviewsArray) {
    ReviewsResult * result = [[ReviewsResult alloc] init];
    result.User_Caption = [review objectForKey:@"UserCaption"];
    result.ContentType_Id = [review objectForKey:@"DateRecorded"];
    result.Average_Rating = [review objectForKey:@"AverageRating"];
}
  

Редактировать: кроме того, вы должны знать, что вы не очень защищали это. Что произойдет, если данные не совсем такие, как в вашем примере? что произойдет, если отсутствует значение, например «Данные» или «Результат»?
Ваше приложение должно быть достаточно надежным, чтобы не захлебнуться, если произойдет что-то немного неожиданное.

Комментарии:

1. Чем, как я могу справиться, когда происходит что-то немного неожиданное.

2. даже если это не сработает, это приведет к сбою и завершению приложения с ошибкой из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘-[__NSCFDictionary objectAtIndex:]:

3. по этой ссылке NSArray *reviewsArray = [reviewsvalues objectAtIndex:@»Data»]; он показывает мне предупреждение о том, что передача аргумента 1 из ‘objectAtIndex’ делает целое число из указателя без приведения

4. @harish Извините, моя ошибка, objectForKey: не должно быть objectAtIndex: .

5. @harish взгляните на заголовки для NSDictionary и NSArray … постарайтесь, чтобы они были разделены в вашем сознании. Имейте в виду, что вы их перепутаете (как я только что сделал). Вот для чего нужны предупреждения компилятора 😉