JSON анализирует нераспознанный селектор, отправленный в экземпляр 0x8f3ab10

Я пытаюсь проанализировать некоторые очень простые данные json, я делаю то же самое, что и всегда, но получаю следующую ошибку:

-[__NSCFDictionary objectAtIndex:]: нераспознанный селектор отправлен экземпляру 0x8e7d570 2014-04-30 15:04:33.699 Mensagens 2[7530:60b] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '-[__NSCFDictionary objectAtIndex:]: нераспознанный селектор отправлен экземпляру 0x8e7d570'

это файл GET.JSON:

{
  "version":"6"
}

Это код в моем приложении, где я пытаюсь получить значение версии:

NSURL *url = [NSURL URLWithString:@"http://localhost/app/get.json"];

NSData *data = [NSData dataWithContentsOfURL:url];

NSMutableArray *getVersion = [[NSMutableArray alloc]init];
getVersion = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

NSString *currentVersion = [[getVersion objectAtIndex:0]objectForKey:@"version"];

NSLog(@"Version = %@", currentVersion);

Я просто не вижу ни одного, где что-то идет не так.


person André Oliveira    schedule 30.04.2014    source источник
comment
Попробуйте поместить данные объекта JSON в NSDictionary вместо NSMutableArray и пропустите часть objectAtIndex:, так что просто [getVersion objectForKey:@"version"]   -  person Stonz2    schedule 30.04.2014
comment
Прочтите ошибку. Он точно скажет вам, в чем проблема. И отладчик точно покажет, какая строка вызывает проблему. Если нет, см. raywenderlich.com/10209/my-app- разбился-теперь-что-часть-1   -  person rmaddy    schedule 30.04.2014
comment
возможный дубликат [__NSCFDictionary objectAtIndex:]: нераспознанный селектор отправлен экземпляру   -  person rmaddy    schedule 30.04.2014


Ответы (2)


Должен быть

NSDictionary *getVersion = [NSJSONSerialization JSONObjectWithData:data 
                                                        options:kNilOptions error:nil];
NSString *currentVersion = [getVersion objectForKey:@"version"];

или с новым синтаксисом

NSString *currentVersion = getVersion[@"version"];

потому что objectAtIndex означает, что вы обращаетесь к массиву, но у вас есть только объект json

person meda    schedule 30.04.2014
comment
Объект JSON может быть массивом, в данном случае это просто не так. - person Stonz2; 30.04.2014
comment
@Stonz2, где массив? { "version":"6" } - person meda; 30.04.2014
comment
Я знаю, что это не массив в примере спрашивающего, я просто указываю, что объект JSON МОЖЕТ быть массивом. - person Stonz2; 30.04.2014
comment
Спасибо за точный ответ, я приму ваш ответ как можно скорее. - person André Oliveira; 30.04.2014
comment
@Stonz2 a JSON object CAN be an array Я не понимаю? я понимаю object -> NSDictionary и array->NSArray. - person meda; 30.04.2014
comment
Вполне возможно, что это массив. Например, если ваш JSON был [{key:value},{key:value}], вы могли прочитать его в NSArray с JSONObjectWithData. Ожидаемое возвращаемое значение этого метода, согласно Apple: A Foundation object from the JSON data не обязательно просто NSDictionary - person Stonz2; 30.04.2014
comment
Чтобы быть в безопасности, сохраните результат JSONObjectWithData:… в id, а затем проверьте его с помощью -isKindOfClass: или -respondsToSelector: перед вызовом методов для него. Особенно важно, если вы не контролируете источник данных JSON. - person Zev Eisenberg; 30.04.2014

Независимо от типа, который вы использовали для объявления getVersion, приведенный ниже метод создает NSDictionary или NSArray в зависимости от данных, переданных этому методу. В вашем случае кажется, что данные ответа JSON являются словарем, поэтому, хотя getVersion объявлен (или, если на то пошло, даже создан) как объект NSMutableArray, после выполнения ниже getVersion является NSDictionary.

getVersion = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

Как ответил меда, вы можете использовать [getVersion objectForKey:@"Version"], чтобы получить то, что вы ищете.

person mithlesh jha    schedule 30.04.2014