NSJSONSerialization JSONObjectWithData возвращает значение null, если объект json имеет какое-то ненужное значение

Я использую следующий фрагмент кода для анализа объекта JSON из URL-адреса.

   NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlAddress] options:NSDataReadingUncached error:&error];
    if (error != nil) {
        NSLog(@"%@",[error localizedDescription]);        
    }   else {
        NSLog(@"No Error: %@", data);  //looks good here. console displays the raw data 
    }

    id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

    if (error != nil) {
        NSLog(@"%@",[error localizedDescription]);
        return nil;

    }   else {
        NSLog(@"No Error: %@", [result objectForKey:@"exams"]); //console displays the value ("No Error: value for key...") unless a degree symbol is present in which case it displays No Error: (null)

    }

У меня есть около 10 urlAddresses, для 7 URL-адресов JSONObjectWithData возвращает объект json. Для оставшихся 3 URL-адресов JSONObjectWithData возвращает null. Я пытался открыть эти URL-адреса в сафари. Я видел в нем несколько ненужных символов. Я подозреваю, что проблема связана с этим ненужным персонажем. Как решить этот вопрос?

Я видел это "JSONObjectWithData возвращает значение null, если символ степени в объекте json" аналогичная ссылка. Предлагается использовать escape-последовательность Unicode. Как использовать эту "escape-последовательность Unicode" для решения моей проблемы.


person Akbar    schedule 15.05.2013    source источник
comment
Вероятно, проблема с кодировкой. Отправляет ли сервер данные в кодировке UTF-8? Можете ли вы привести пример URL-адреса или данных, которые нельзя преобразовать?   -  person Martin R    schedule 15.05.2013
comment
Извините, Мартин, мой URL-адрес является конфиденциальным, но я могу поделиться частью данных, приведенных ниже Таранг Бхарадвадж. Протег Таранга и друг детства Саргам, Вот у протега странные символы.   -  person Akbar    schedule 15.05.2013
comment
Трудно анализировать эту проблему, не видя фактических данных/байтов. Возможно, вы можете NSLog() данные, найти эту часть в шестнадцатеричном выводе и показать ее?   -  person Martin R    schedule 15.05.2013


Ответы (2)


Я согласен, что есть проблема с кодировкой, как уже было сказано.

Ссылаясь на RFC 4627, глава 1, строка JSON «[…] представляет собой последовательность из нуля или более символов Unicode […]». Ссылаясь на RFC 4627, глава 3, «текст JSON ДОЛЖЕН быть закодирован в Unicode. Кодировка по умолчанию — UTF-8». То, что вы получаете, вероятно, не является юникодом. (Пожалуйста, проверьте это сначала.)

У вас есть несколько вариантов, чтобы справиться с этим:

а) Распечатайте RFC 4627 на плотной бумаге. Подойдите к человеку, который отвечает за отправку этого ответа, и стучите бумагой по его голове, пока он не скажет: «Я буду уважать RFC 4627». (Это один из редких случаев, когда насилие является решением.)

б) Если вы знаете используемую кодировку, создайте строку из данных, а затем перекодируйте ее в юникод. Затем отсканируйте закодированные данные с помощью NSJSONSerializer.

c) Замените вхождения неверных кодов вручную.

person Amin Negm-Awad    schedule 15.05.2013

Удаление ненужных символов из объекта JSON https://gist.github.com/oleganza/781772

person Akbar    schedule 13.06.2013
comment
Я думаю, что метод распечатки RFC 4627 работает лучше и приносит больше удовлетворения. - person gnasher729; 09.02.2016