无法快速下载太大的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 数据可能是无效的。如果您在处理程序中记录 print data,它应该让您了解数据的样子。 如何在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数据的主要内容,如果未能解决你的问题,请参考以下文章

使用Curl从firebase导出大型json数据的问题

json与bson区别

无法快速从 JSON 中正确提取数据

BSON和JSON的区别

优雅的查看json文件

解决.NETMVC(ajax)Json请求太大,无法反序列化(The JSON request was too large to be deserialized)问题