Я знаю, что многие вопросы касались этой проблемы, но я не нашел ни одного, который бы помог мне …
Когда я анализирую данные 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
}
Я не знаю, почему эта инициализация падает здесь …
Обновленный ответ:
Теперь я думаю, что после того, как вы опубликовали код 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.
Других решений пока нет …