Сбой разбора json — ошибка какао 3840 и недопустимое значение вокруг символа 0

Я знаю, что многие вопросы касались этой проблемы, но я не нашел ни одного, который бы помог мне …

Когда я анализирую данные json, загруженные с локального хоста (сервер MAMP), я сталкиваюсь с ошибкой json 3840, в которой указывается недопустимое значение вокруг символа 0 …

Я не понимаю почему, так как мой php-скрипт с var_dump на моем массиве отображает (массив массива):

array(2) { [0]=> array(5) { ["ID"]=> string(1) "1" ["EDS"]=> string(4) "1000" ["lastname"]=> string(8) "My lastname" ["firstname"]=> string(9) "My firstname" ["dateOfBirth"]=> string(10) "19.12.1975" } [1]=> array(5) { ["ID"]=> string(1) "2" ["EDS"]=> string(4) "1001" ["lastname"]=> string(14) "Smith" ["firstname"]=> string(6) "John" ["dateOfBirth"]=> string(10) "11.11.1111" } }

…который для меня, кажется, является допустимым массивом JSON.

Когда я регистрирую загруженный NSMutableData, это не нуль, но что-то вроде

76353648 2734b0a9 (+ around fifty like this).

Я не знаю, так ли это, потому что данные не полны, но я не знаю, как мне продолжить анализировать, что происходит не так.

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

Большое спасибо!

Изменить: добавлен код продолжения к исходному вопросу:

В

(void)connectionDidFinishLoading:(NSURLConnection *)connection {
id jsonObject = [NSJSONSerialization JSONObjectWithData:_downloadedData options:NSJSONReadingAllowFragments error:&error];

if ([jsonObject isKindOfClass:[NSArray class]]) {

NSArray *deserializedArray = (NSArray *)jsonObject;

for (NSDictionary *jsonElement in deserializedArray)
{
Person *newPersonElement = [[PersonStore sharedStore] createPerson]; // --> what makes the app crash. But this method is working everywhere else...
// more code omitted
}

Я не знаю, почему эта инициализация падает здесь …

2

Решение

Обновленный ответ:

Теперь я думаю, что после того, как вы опубликовали код Objective-C, который использует этот полученный JSON, становится ясно, в чем собственно проблема.

Мне кажется, что вы используете Core Data (PersonStore) чтобы сохранить ваши входящие данные.

Если вы делаете вызовы Core Data из того же потока, что connectionDidFinishLoading: вызывается, вы, скорее всего, столкнетесь с проблемой многопоточности, когда Core Data недовольна тем, что вы вызываете ее из потока, отличного от основного потока.

Попробуйте это: в вашем connectionDidFinishLoading: оберните ваш код в следующее:

dispatch_async(dispatch_get_main_queue(), ^{
// Include the code here that walks over the incoming JSON
// and creates new `Person` instances.
});

Это выполнит все в этом блоке в главном потоке. Что, как правило, хорошая идея для использования Core Data. (Возможно, даже требуется, проверьте документацию, есть специальный раздел по основным данным & Темы, если я правильно помню).

Очень любопытно, если это сработает.

Старый ответ:

Выход из vardump на самом деле не является действительным JSON. Вам нужно использовать json_encode() функция вместо

Вы можете включить NSData что вы получили от сервера в строку, выполнив что-то вроде этого:

if let s = String(data: data, encoding: NSUTF8StringEncoding) {
println(s)
}

Вы не упомянули, работаете ли вы в Swift или Objective-C, но вышесказанное легко переводится в Objective-C.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]