нераспознанная ошибка селектора с NSJSONSerialization + AFNetworking - PullRequest
5 голосов
/ 20 марта 2012

Обновление: Я только что проверил свой формат JSON, возвращенный с сервера, используя JSONlint , и все в порядке.

Я получаю исключение с NSJSONSerialization при вызове AFNetworking для сценария php, который возвращает данные JSON. Я посмотрел другие вопросы с той же проблемой и попробовал эти решения, но все еще получаю сообщение об ошибке.

В этой строке вылетает:

 NSError *e = nil;
 NSMutableArray *jsonArray = 
 [NSJSONSerialization JSONObjectWithData: jsonData 
                                 options: NSJSONReadingMutableContainers 
                                   error: &e];

Журнал ошибок:

2012-03-19 18: 10: 41.291 imageUploader [3538: 207] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSCFArray bytes]: нераспознанный селектор отправлен в экземпляр 0x6867430'

Мои данные JSON, когда я вызываю php-скрипт через браузер, выглядят так:

[{ "пользователь": "Бинка", "путь": "Binky-0a96f9aab5267c8.jpg", "Индекс": "101"}, { "пользователь": "Бинка", "путь": "binky- 9cf844252c28553.jpg», "индекс": "102"}, { "пользователь": "Бинка", "путь": "Binky-d6c749d25d33015.jpg", "индекс": "103"}] * * тысяча двадцать-семь

NSLog данных выглядит так:

( { индекс = 101; путь = "binky-0a96f9aab5267c8.jpg"; пользователь = binky; }, { индекс = 102; путь = "binky-9cf844252c28553.jpg"; пользователь = binky; }, { индекс = 103; путь = "binky-d6c749d25d33015.jpg"; пользователь = binky; })

Наконец, я делаю тест, чтобы убедиться, что у меня есть действительные данные JSON:

         if ([NSJSONSerialization isValidJSONObject: jsonData]){
             NSLog(@"Good JSON \n");
         }

Так что я не могу понять, где источник моей ошибки. Маленькая помощь?

// Операция AFNetworking + блок

    AFJSONRequestOperation *operation = 
    [AFJSONRequestOperation JSONRequestOperationWithRequest:myRequest 
     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id jsonData) {

         NSLog(@"Success JSON data:\n %@ \n", jsonData); //log data

         if ([NSJSONSerialization isValidJSONObject: jsonData]){
             NSLog(@"Good JSON \n");
         }

         NSError *e = nil;
         NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e];

         if (!jsonArray) {
             NSLog(@"Error parsing JSON: %@", e);
         } else {
             for(NSDictionary *item in jsonArray) {
                 NSLog(@"Item: %@", item);
             }
         }

         [self.navigationController popToRootViewControllerAnimated:YES];
     } 
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

         NSLog(@"Error: %@", error);
         [self.navigationController popToRootViewControllerAnimated:YES];
     }];

1 Ответ

7 голосов
/ 20 марта 2012

Очевидно, JSONObjectWithData ожидает NSData, а не массив.id jsonData представляется массивом, представляющим содержимое вашей строки json.Очевидно, вы ожидаете массив в любом случае.

Почему-то вы делаете это дважды.Вместо

 NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData: jsonData options: NSJSONReadingMutableContainers error: &e];

вы можете просто использовать

NSMutableArray *jsonArray = [NSMutableArray arrayWithArray:jsonData];

или, если это не обязательно должно быть изменяемым:

NSArray *jsonArray = (NSArray *) jsonData;

Однако вы всегда должны проверятьдействительно ли это массив в jsonData.В зависимости от структуры в строке json это может быть NSDictionary или nil в случае ошибок.

...