json解析失败 - 可可错误3840和字符0周围的值无效

时间:2015-03-07 00:03:12

标签: php ios json parsing ios8

我知道很多问题已经解决了这个问题,但我找不到一个帮助我的问题......

当我解析从localhost(MAMP服务器)下载的json数据时,我面对json错误3840,指出字符0周围的无效值...

我不明白为什么,因为我的数组上的var_dump的php脚本显示(数组数组):

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时,它不是null,而是类似

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
}

我不知道为什么这个初始化会在这里崩溃......

1 个答案:

答案 0 :(得分:1)

更新回答:

我认为你已经发布了使用这个收到的JSON的Objective-C代码,但是很清楚实际问题是什么。

听起来您使用核心数据(PersonStore)来保留传入的数据。

如果您正在从调用connectionDidFinishLoading:的同一线程进行Core Data调用,那么您很可能会遇到一个线程问题,其中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& Threads的特殊部分。)

非常好奇,如果这样做的话。

旧回答:

vardump的输出实际上并不是有效的JSON。您需要使用json_encode()函数。

您可以通过执行以下操作将您从服务器收到的NSData转换为字符串:

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

您没有提及您是使用Swift还是Objective-C,但上述内容很容易转换为Objective-C。