每次我收到错误:
jsonError :: Error Domain = NSCocoaErrorDomain Code = 3840“字符1周围的值无效。” UserInfo = {NSDebugDescription =字符1周围的值无效}}
let dataTask: URLSessionDataTask = session.dataTask(with: urlRequest as URLRequest) { (data:Data?, response:URLResponse?,error: Error?) in
if((error) != nil){
completionHandler(false, nil, error)
}
else{
do {
let responseData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)
if responseData is Dictionary<String, Any>{
print("dictionary type")
}
else if responseData is Array<Any>{
print("array type")
}
}
catch let jsonError {
print("jsonError::\(jsonError)")
completionHandler(false, nil, jsonError)
}
}
}
dataTask.resume();
请建议。提前致谢。
答案 0 :(得分:0)
错误(指向您实际检查错误,令人惊讶的是,有多少人在不这样做的情况下提出问题)告诉您,您收到的数据根本不是有效的JSON。
您说您收到了带有html代码的回复。这意味着服务器代码中断,或者使用不正确的URL或不正确的参数。如果您要求它们返回JSON,许多服务器将返回JSON,否则返回HTML,因此您只需要弄清楚如何正确地询问。 (通常您只需在浏览器中键入URL的变体即可找到)。
我注意到你使用了.allowFragments。此选项允许解析器不仅解析字典和数组,还解析“片段”,即字符串,数字,布尔值或null。显然在这些情况下你不会得到字典或数组,所以除非你期望一个片段并知道如何处理它,否则不要使用这个选项。
您似乎期望字典或包含单个字典的数组。 (我先询问是否可以接受空数组或包含多个字典的数组,如果是,则需要更改代码)。我假设您要在所有错误情况下报告错误。我会像这样编写dataTask完成处理程序(由你来编译)
guard error == nil else {
handle error
return
}
guard data != nil else else {
handle error
return
}
guard let parsed = try? JSONSerialization.jsonObject (...) else {
handle error
return
}
if let dict = parsed as? [String: Any] {
handle result dict
return
}
guard let array = parsed as? [Any] else {
handle error
return
}
guard array.count == 1 else {
handle error
return
}
if let dict = array [0] as? [String: Any] {
handle result dict
} else {
handle error
}