JSON文本没有开始数组或对象和选项,以允许片段没有设置

我发送这个从服务器的JSON响应请求到我的IOS 7应用程序。

{ "root": { "success": "1", "message": "Successfully retrieved data.", "data": { "records": [ { "receipt_key": "xxxxxxxx", "receipt_id": "xxxxxxxx", "store_name": "xxxxxx", "amount": "xxxx", "date_purchase": "xxxxxxxx", "is_processed": "x", "created_on": "xxxxxxxx", "modified_on": "xxxxxxxx", "modified_on_millis": "xxxxxxxx", "user_folder": "xxxxxxxx", "category_id": "xxxxxxxx", "is_deleted": "x", "currency_id": "xxxxxxxx" } ] } } } 

我使用下面的代码来parsing上面的json到NSDictionary对象。

  NSMutableDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; 

但是我在上面的代码中得到这个错误。

错误域= NSCocoaErrorDomain代码= 3840“该操作无法完成(cocoa错误3840.)”(JSON文本没有开始数组或对象和选项,以允许片段没有设置)UserInfo = 0x8a8a700 {NSDebugDescription = JSON文本没有开始数组或对象和选项,以允许片段没有设置。}

从php页面消费饲料时,我遇到了同样的错误。 就像你遇到的那样,得到的jsonstring通过了一个视觉检查,但是不能序列化。 我怀疑在feed的某个地方有一个隐藏的字符,所以我把每个字符都转换成unicode的十进制数,然后检查结果:

 NSString *feedStr = [[NSString alloc] initWithData:feedData encoding:NSUTF8StringEncoding]; for(int i=0; i<[feedStr length]; ++i) { unichar c = [feedStr characterAtIndex:i]; NSLog(@"decimal char %d", c); } 

我发现在第一个字符之前和最后一个字符是#65279。 快速谷歌search后,我发现这是什么字符? 65279 ,这被确定为字节顺序标记 。

在我的情况下,我可以通过打开和保存所有包含的php文件来解决这个问题,使用文本编辑器提供了一个选项来使用“无编码的UTF-8编码”编码。 有关PHP方面的更多信息,请参阅如何避免在PHP中回显字符65279?

通常是因为某些警告消息从您的服务器中抛出,而没有放入响应数组中。 例如在PHP中,一些“警告消息”没有被捕获到数组中,所以当你最终使用“echo json_encode($ RESPONSE_ARR)”时,它不是JSON格式。

你发布的JSON看起来不错。 如果这是你的iOS应用程序收到的,它将被parsing。 即使它不是好的,你也不会得到这个错误信息。 如果它是一个数组,则JSON必须以“[”开始;如果它是一个类似于你的字典,那么“{”以及其他所有得到错误消息的地方都是这样。 所以即使你发送'[934knsdf239] [@@@',你也不会得到这个错误信息,因为数据是以[指示一个数组开始的。

你需要在iOS应用程序中进行debugging。 首先将数据转换为string并打印并检查。 如果string看起来不错,然后打印数据本身 – 有时人们设法添加0字节或控制字符,或者两个字节顺序标记或类似的string中不可见,但不是合法的JSON。

选项NSJSONReadingAllowFragments允许只包含string,数字,布尔值或空值的JSON。 除非你想能够自己处理其中的一个,否则不要使用它。

我面临同样的问题。 但是,我发现我发送的URL作为服务器的参数是错误的。 有一个字符错误。 例如,我发送下面的url

 URL = https://somerUrl/api/v2/&venues/search?client_id=jkdasljf3242jka-fsdf-fadsfasd&lat=40.712488&long=-74.006277&distance=25 

错误是在场地制造麻烦之前额外的&符号。 所以我删除&符号,发现为我工作。 所以,确保你发送正确的参数到服务器。