无法快速下载太大的json数据
Posted
技术标签:
【中文标题】无法快速下载太大的json数据【英文标题】:unable to download json data too large in swift 【发布时间】:2017-10-06 17:11:27 【问题描述】:我尝试从接受 json 格式的用户名和密码输入的网络服务器将数据下载到 JSON。一旦我通过了身份验证,我必须下载 json 数据。所以我用了这个方法
let postString = ["user":"user1", "pwd": "pass1"]
var request = URLRequest(url:URL(string:"http://vdctest.agrishare.com/list_up")!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue("application-idValue", forHTTPHeaderField: "secret-key")
request.httpBody = try! JSONSerialization.data(withJSONObject: postString, options:.prettyPrinted)
let session = URLSession.shared
//Post
session.dataTask(with: request)data, response, err in
//Guard: ws there error ?
guard(err == nil) else
print("err")
return
//Guard: check was any data returned?
guard let data = data else
print("no data return")
return
//Convert Json to Object
let parseResult: [String:AnyObject]!
do
parseResult = try JSONSerialization.jsonObject(with: data, options:.allowFragments) as! [String:AnyObject]
print("\(parseResult)")
catch
print("Could not parse data as Json \(data)")
return
//Check jsonDictionary
guard let jsonArray = parseResult["success"] as? [String:AnyObject] else
print("jsonDictionary error")
return
//check jsonArray and switch to LoginViewController
if(jsonArray.count == 0 )
print("jsonArray not found")
return
else
DispatchQueue.main.async
let loginvc = LoginViewController()
self.present(loginvc, animated: true, completion: nil)
print(jsonArray)
.resume()
当我运行应用程序时,终端会说:
无法将数据解析为 Json 1520 字节
为什么?
输出:
无法将数据解析为 Json:Error Domain=NSCocoaErrorDomain Code=3840 “字符 0 周围的值无效。” UserInfo=NSDebugDescription=字符 0 周围的值无效。
【问题讨论】:
将print("Could not parse data as Json \(data)")
更改为 print("Could not parse data as Json: \(error)")
并使用输出更新您的问题。
您没有返回 JSON。将data
转换为String
并查看它。
@rmaddy 怎么样?! ??????
let resultString = String(data: data, encoding: .utf8)
。请注意,可能是nil
,这意味着字符串使用不同的编码或数据不代表文本。
好了,现在您知道为什么不能解析 JSON 了。您没有收到任何 JSON,而是从服务器收到错误消息。阅读该结果并修复您的请求,以免导致服务器返回错误。或者联系服务器开发人员,让他们最终解决问题。
【参考方案1】:
您可能没有有效的 JSON - 如错误所述,就在第一个字符附近。有效的 JSON 要么是一个使用 和
打开和关闭的对象,要么是一个对象数组,使用
[
和 ]
打开和关闭。
请发布一些返回的 JSON 以确认。
编辑:另外——如果您请求的是http
资源,而不是https
,则需要将服务器添加到允许的不安全服务器列表中。
【讨论】:
@Taprolano 我的意思是从请求返回的 JSON 数据可能是无效的。如果您在处理程序中记录 printdata
,它应该让您了解数据的样子。
如何在handler中打印数据?打印(数据)?
我用print(data)
打印了数据,但控制台中没有任何变化
@Taprolano Ahh, nm -- 只打印 NSData 大小。 print(String(data: data!, encoding: String.Encoding.utf8))
应该将数据呈现为可打印的字符串。
@Taprolano 你的服务器肯定有问题。返回的数据的第一位表示<h1>500 Internal Server Error</h1><h3>oci_connect(): ORA-28000: the account is locked (2)</h3><pre>#0 [internal function]: flight\Engine->handleError(2, 'oci_connect(): ...', '/usr/local/vdc/...', 30, Array)
。这不是 JSON。以上是关于无法快速下载太大的json数据的主要内容,如果未能解决你的问题,请参考以下文章
解决.NETMVC(ajax)Json请求太大,无法反序列化(The JSON request was too large to be deserialized)问题