iOS JSON Error: NSDebugDescription=Garbage at end


iOS JSON Error: NSDebugDescription=Garbage at end

这是一个非常奇怪的错误,当从我的服务器抓取JSON(这是通过PHP产生的),我得到这个错误时调用:

json = [NSJSONSerialization JSONObjectWithData:kivaData
                                       options:kNilOptions
                                         error:&jsonError];

JSON Error: ErrorDomain =NSCocoaErrorDomain Code=3840 "操作无法完成。(Cocoa错误3840)"(最后是垃圾。)UserInfo=0x178467d00 {NSDebugDescription=垃圾结束}

My (NSData* kivaData)可以抓取所有内容,但是它不能解析JSON。

我在http://jsonlint.com/中运行了JSON代码,每次都是有效的。

它真的很奇怪,因为它可以解析JSON当我连接到Wifi,但当我尝试通过蜂窝做它,它不会工作。在某些人的手机上确实可以,但每次。

使用swift 4,首先使用print:

检查JSON数据
print (String(data:data!, encoding: .utf8)!)

检查空格或不需要的字符,然后删除它们:

var string = String(data: data!, encoding: .utf8)
string = string?.replacingOccurrences(of: "/r/n", with: "")

之后,将字符串赋值给数据变量:

let data1 = string!.data(using: .utf8)

编码非常重要。如果你的json是有效的,问题可能是你的json数据中有特殊字符,json序列化器没有正确解析。当您发送数据时,请确保在发送内容时具有正确的url编码,以便客户端能够正确解析它。使用utf-8或base64

我能够解决同样的问题(在wifi上工作,但不能在运营商网络上)通过在响应之前发送一个内容长度的头:

header("Content-length: ".strlen($response));
echo $response;
exit;

我最终不得不改变我的php文件,从回显json语法到简单地输出json_encode

JsonData通常以字典格式存储。由于json无法解析连续数据[无法分离响应],因此抛出此错误。

您可以维护一个字典来存储从服务器获得的响应。每个任务都有一个唯一的响应。因此,创建一个字典,其中"keys"作为任务的"taskIdentifier", "values"作为"data"。

如:在didReceiveData或任何其他等效方法中[从服务器获取响应]将响应存储在字典中,并以taskIdentifier作为键。

 NSString *taskID = [@(dataTask.taskIdentifier) stringValue];
[_task_data_dictionary setObject:data forKey:taskID];

这里_task_data_dictionary是字典。这样就可以消除上述误差。

之后,您可以使用相同的字典使用以下代码

获取数据
 NSData *data = [_task_data_dictionary objectForKey:taskNumber];

再次使用taskIdentifier