NSJSONSerialization – «Неожиданный конец файла во время синтаксического анализа»

У меня есть проводная проблема при анализе REST-Response. Проблема в том, что я не могу воспроизвести ее. Иногда это происходит, и у меня нет соответствующей информации в журналах ошибок.

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn't be completed. (Cocoa error 3840.)" (Unexpected end of file during string parse (expected low-surrogate code point but did not find one).) UserInfo=0x157bddb0 {NSDebugDescription=Unexpected end of file during string parse (expected low-surrogate code point but did not find one).} 

Извините, мне не разрешено предоставлять вам какую-либо информацию из JSON-Response из-за чувствительных пользовательских данных (она появляется только на некоторых внутренних учетных записях, где уровень журнала ошибок установлен на низком уровне, чтобы обнаружить эту проблему).

Другая информация:

  • JSON действителен (проверен через http://jsonlint.com/ )
  • При попытке воспроизвести эту проблему я получаю другие описания NSError, например:
    • Символ в позиции XYZ недействителен
    • Недопустимый объект

ОБНОВЛЕНИЕ 1: Механизм анализа (расширение NSData)

 - (NSDictionary *)objectFromJSONDataWithError:(NSError **)error { NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: self options: 0 error: error]; return jsonObject; } 

Обновление 2: NSOperation для загрузки данных – Содержание функции main () -> Calls в Update 1

 NSURLResponse *response = nil; NSError *error = nil; NSData *data = nil; for (NSInteger i=0; i<kMaxRequestRetry; i++) { data = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error]; if (!error) { // Handling internal errors and retry mechanism } [NSThread sleepForTimeInterval:1.0]; } // Check http status code NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode]; if (statusCode < 200 || statusCode >= 300) { CLogWarn(@"Request finished with status code = %d", (int)statusCode); } // Evaluate response if (error) { CLogError(@"%@", error); [self requestFinishedWithResult:@"{\"errorCode\":99}"; return; } else { NSError *parseError = nil; NSDictionary *responseDic = [data objectFromJSONDataWithError:&parseError]; // Detect parse issues if (parseError) { CLogError(@"JSONParse-Error: %@", parseError); [self requestFinishedWithResult:[NSString stringWithFormat:@"{\"errorCode\":%d}", (11000 + (int)parseError.code)]]; return; } // Success handling } 

Обновление 3: структура JSON-Object

 { "errorCode": 0, "conversations": [ { "address": "+43664000000", "snippet": "This is an dummy text", "messagesUnread": 1, "messagesUnsent": 2, "messages": 9, "maxMessageId": 151672, "dateLastMessage": 1386353756858 } ] } 

Я рад за любую информацию или советы, как заставить этот код ошибки.

С наилучшими пожеланиями,
Крис

Воспроизведение проблемы

Причина этой проблемы в том, что string в json содержит недопустимую Unicode Point. Следующий код может воспроизвести эту проблему.

 NSString* test = @"{\"\\ud801\" : 1}"; NSError* error = nil; id result = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error]; NSLog(@"error: %@", error); 

Решение

Согласно Readme.md в JSONKit , вы можете использовать JSONKit в качестве дополнительного анализатора. например

  id result = [NSJSONSerialization JSONObjectWithData:data options:options error:&error]; if (error) { error = nil; result = [data objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode error:& error]; // use JSONKit } 

Нашел вопрос. «Фрагмент» в объекте json содержит подстроку из исходного сообщения. Наш API (написанный в java) использует метод подстроки и это сокращение суррогатной пары. У клиентов Android и Windows нет проблем с этим, и отображается только недопустимый символ, но NSJSONSerialization выдает эту ошибку.

Получил совет через форум apple dev: https://devforums.apple.com/message/961738#961738

  • Параметр ошибки в dataWithJSONObject: options: error:
  • NSJSONSerialization JSONObjectWithData: опции: ошибка: проблема с кодировкой
  • Как преобразовать динамический NSString в формат JSON в iOS?
  • Отмена NSJSONSerialization - поиск по мере ввода, запрос перекрытия
  • Как я могу получить данные POST в API REST на основе JSON, используя класс NSJSONSerialization?
  • Не удается извлечь массив из JSON
  • Другие варианты, чем NSJSONWritingPrettyPrinted?
  • Анализатор NSJSONSerialization vs на основе потока
  • нет возврата в NSJSONSerialization
  • Как сообщить 0/1 из false / true с помощью NSJSONSerialization?
  • Может ли NSJSONSerialization обрабатывать значение null?
  • Давайте будем гением компьютера.