HTTP获取接收JSonObjects Swift DebugDescription =字符0周围的值无效

时间:2016-06-18 07:30:01

标签: ios json swift

我在向服务器发送HTTP GET命令以检索JSONObjects时遇到问题。

这是命令:

        if let url: NSURL = NSURL(string: "http://11.22.33.44:8080/SRV/getAllUsers?owner=\(User.sharedInstance.email)") {
        print("\nSending URL: \(url)")
        let request = NSURLRequest(URL: url)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{
            (response: NSURLResponse?, data: NSData?, error: NSError?)-> Void in


            print("Response: \(response) \n")

            do{

                var datastring = NSString(data:data!, encoding:NSUTF8StringEncoding) as String?
                print("Data: \(datastring)")

                let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)

             print("Json: \(json)")

            }catch {
                print("Error with Json: \(error)")
            }

        });

我收到了一个包含所有标题信息的HTTP 200,但我正在尝试将NSData打印为String(nil)并尝试检索我的JSONObjects,我收到以下消息:

  

数据:无   Json出错:Error Domain = NSCocoaErrorDomain Code = 3840“字符0周围的值无效。” UserInfo = {NSDebugDescription =字符0周围的值无效。}

我正在管理服务器部分,正在准备JSONObjects的servlet正在执行以下操作:

ObjectOutputStream objOut = new ObjectOutputStream(response.getOutputStream());   
JSONObject jsonObj = new JSONObject();
jsonObj.put("id","1234");
objOut.writeObject(jsonObj);
objout.flush();
jsonObj = new JSONObject();
jsonObj.put("id","5678");
objOut.writeObject(jsonObj);
objout.flush();

以及最后一个重要信息,我能够从Android应用程序中检索那些JSONObject而没有任何问题,但似乎在swift中JSONObjects所期望的格式不一样......

修改

我改变了使用NSURLSession发送HTTP GET命令的方法,但在处理JSONObject之前,我至少尝试将数据显示为String:

typealias Payload = [String: AnyObject]

        let url = NSURL(string: "http://11.22.33.44:8080/SRV/getAllUsers?owner=\(User.sharedInstance.email)")
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url!) { (data, response, error) -> Void in

            if(error == nil)
            {
                let err : NSError! = nil

                    print("Response \(response)")

                    guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
                        print("error")
                        return
                    }

                    let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
                    print("Data: \(dataString)")

                    var json: Payload!

                    // 1
                    do {
                        json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as? Payload
                        print("JSon: \(json)")
                    } catch {
                        print(error)
                        //XCPlaygroundPage.currentPage.finishExecution()
                    }



            }
            else
            {
                print(error?.description)
            }

        }
        task.resume()

我收到了一个带有正确头信息的HTTP 200,所以我确定servlet被成功调用,但是数据为nil

  

数据:无   Error Domain = NSCocoaErrorDomain Code = 3840“JSON文本没有以数组或对象开头,并且选项允许未设置片段。” UserInfo = {NSDebugDescription = JSON文本不以数组或对象开头,并且选项允许未设置片段。}

编辑#2

使用以下行

guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
            print("error data")
            return
        }

        print("data: \(data?.debugDescription)")

我可以检索以下内容:

  

数据:可选(“OS_dispatch_data:data [0x7fc68bc45380] = {composite,size => 1067,num_records = 5 record [0] = {from = 0,length = 404,data_object => 0x7fc68bc999d0},记录[ 1] = {from = 0,length = 135,data_object => 0x7fc68be1f830},记录[2] = {from = 0,length = 264,data_object => 0x7fc68bc99a80},记录[3] = {from = 0, length = 133,data_object => 0x7fc68bf97c20},record [4] = {from = 0,length = 131,data_object => 0x7fc68bca0b40},}>“)

意味着我能够检索数据(至少!)但我不知道如何从这些数据中提取我的JSONObject ....

我终于找到了我的问题。 服务器部分需要像这样准备JSONObject:

response.setContentType("application/json");
// Get the printwriter object from response to write the required json object to the output stream      
PrintWriter out = response.getWriter();
// Assuming your json object is **jsonObject**, perform the following, it will return your json object  
out.print(jsonObject);
out.flush();

而不是使用ObjectOutPutStream。

Swift部件可以像这样检索它:

let url_to_request = "http://11.22.33.44:8080/SRV/getAllUsers?owner=\(User.sharedInstance.email)"

    let url:NSURL = NSURL(string: url_to_request)!
    let session = NSURLSession.sharedSession()

    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "GET"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
    request.timeoutInterval = 10


    let task = session.dataTaskWithRequest(request) {
        (
        let data, let response, let error) in

        guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
            print("error data")
            return
        }


        var json: AnyObject?

    do
    {
        json = try NSJSONSerialization.JSONObjectWithData(data, options: [])


        for anItem in json as! [Dictionary<String, AnyObject>] {
            let nom = anItem["nom"] as! String
            let prenom = anItem["prenom"] as! String
            let id = anItem["id"] as! String
            print("nom: \(nom) prenom: \(prenom) id: \(id)")
        }

    }
    catch
    {
        print("error Serialization")
        return
    }
    }

    task.resume()

0 个答案:

没有答案