#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 … постарайтесь, чтобы они были разделены в вашем сознании. Имейте в виду, что вы их перепутаете (как я только что сделал). Вот для чего нужны предупреждения компилятора 😉