NSString от NSData Server возвращает NSData с ведущими нулями

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

Когда я использую следующий код, строка выглядит нулевой:

    NSString* newStr = [[[NSString alloc] initWithData:dataToBeLoaded encoding:NSUTF8StringEncoding] autorelease];

Это, по-видимому, распространенная проблема, но я не видел четкого ответа о том, как преобразовать NSData в NSString.

До недавнего времени я видел эту проблему с промежуточным значением NSString, но она исчезла после того, как я удалил несколько (но не сотни) символов из начала и конца. NSString после удаления был в полном порядке, поэтому я полагаю, что проблема не в методе кодирования.

Есть ли встроенный метод, который сделает это правильно? Я должен представить, что было бы более эффективно, если бы код, который я написал, проходил бы байт за байтом.

Кстати, когда я вручную отправляю запрос JSON на сервер в своем браузере, ответ возвращается как совершенно правильный JSON, без каких-либо явных проблем, отображаемых на экране браузера.

Есть идеи, что мне делать? Спасибо.


person Jim    schedule 15.09.2011    source источник
comment
Почему это должно быть общей проблемой? Где еще вы это видели? Вы проверили с помощью fiddler (или аналогичного инструмента), что ответ JSON от сервера в порядке? Каково содержание dataToBeLoaded? Полный ответ JSON или только часть ответа JSON? Пожалуйста, предоставьте больше информации.   -  person Codo    schedule 15.09.2011
comment
Прочитав этот вопрос еще раз, мне кажется ясным, что нужно исправлять серверную часть, а не клиент iOS или Mac OS? Вы можете починить сервер или это кто-то другой? Какая серверная технология все-таки используется?   -  person Codo    schedule 15.09.2011
comment
Хорошо, я не знаю, распространено ли это в мире миллионов программистов, но я видел это несколько раз без реального ответа. Сервер не находится под моим контролем, и я видел это на двух серверах, с которыми работаю. Ниже я отвечу на свой вопрос решением, которое я нашел полезным для своего приложения.   -  person Jim    schedule 16.09.2011
comment
Я с трудом могу в это поверить. Можете ли вы предоставить дополнительную информацию о сервере (какую технологию он использует, он является общедоступным), трассировку сети, показывающую передаваемые данные, код, который вы используете для доступа к серверу и обработки ответа и т. д.?   -  person Codo    schedule 16.09.2011
comment
Прости. Я не могу предоставить информацию о сервере. Но в любом случае это не вопрос JSON как такового. Это вопрос об обработке NSString.   -  person Jim    schedule 16.09.2011


Ответы (1)


Данные, возвращаемые с каждого сервера, содержат действительный JSON (во многих случаях проверенный с помощью JSON Lint). В одном случае возвращаемые данные представляют собой оператор присваивания javascript, содержащий объект JSON. В другом случае это просто объект JSON. В обоих случаях я знаю, что объект JSON начинается с фигурной скобки.

Итак, чтобы удалить все начальные нули, я использую код ниже. Кажется, что некоторые методы обрабатывают строковые данные в NSString как строку C, но другие методы знают, что это еще не все, включая понимание длины. К счастью, rangeOfString и substringFromIndex не ограничиваются ведущими нулями.

NSString* newStr = [[[NSString alloc] initWithData:dataToBeLoaded encoding:NSUTF8StringEncoding] autorelease];

if (newStr == nil) return;

NSRange headRange = [newStr rangeOfString:@"{"];
NSString *stripped = [newStr substringFromIndex:headRange.location];
person Jim    schedule 16.09.2011