Php Swift 3函数用于发布数据,当我从服务器收到JSon应答时出现错误

Php Swift 3函数用于发布数据,当我从服务器收到JSon应答时出现错误,php,ios,json,swift3,Php,Ios,Json,Swift3,我在Swift 3中有一个将数据发布到PHP服务器的函数。PHP服务器向iOS发送一个JSon应答,我有一个错误 这是我的职责: func sendRequestPost(urlString: String, dataToPost: String, completion: @escaping (_ dictionary: NSDictionary?, _ error: Error?) -> Void) { DispatchQueue.global(qos: .background

我在Swift 3中有一个将数据发布到PHP服务器的函数。PHP服务器向iOS发送一个JSon应答,我有一个错误

这是我的职责:

func sendRequestPost(urlString: String, dataToPost: String, completion: @escaping (_ dictionary: NSDictionary?, _ error: Error?) -> Void) {

    DispatchQueue.global(qos: .background).async {

        var request = URLRequest(url: URL(string: urlString)!)
        let postString = dataToPost

        request.httpMethod = "POST"
        request.httpBody = postString.data(using: .utf8)

        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {                                                 // Check for fundamental networking error
                print("error=\(error)")
                completion(nil, error)
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // Check for http(s) errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
                // make error here and then
                completion(nil, error)
                return
            }

            let responseString = String(data: data, encoding: .utf8)

            print("responseString : \(responseString)!")

            DispatchQueue.main.async {
                print("DispatchQueue.main.async")
                do {
                    print("enter do")
                    let jsonDictionary:NSDictionary = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] as NSDictionary

                    print("jsonDictionary")
                    print(jsonDictionary)

                    completion(jsonDictionary, nil)
                } catch {

                    print("CATCH ERROR !")
                    completion(nil, error)
                }
            }
        }
        task.resume()
    }
}
例如,我这样调用我的函数:

            let url = "https://mywebsite.com/signup/ios/signup.php"
            let postData = "username=\(txtUsername.text!)&password=\(txtPassword.text!)&confirmPassword=\(txtConfirmPassword.text!)&email=\(txtEmail.text!)&firstname=\(txtFirstname.text!)&lastname=\(txtLastname.text!)"

            sendRequestPost(urlString: url, dataToPost: postData) {
                dictionary, error in

                print("---directory---")
                print(dictionary)
                print("---error---")
                print(error)
                print("==========")
这是我在控制台中看到的:

响应字符串:“{\'异常\':false,\'成功\':false,\'状态\':-9,\'消息\':\'此用户名已存在!\,\'确认消息\':\'空\',\'html \':'空\',\'数据\':'boblongueuil \'}! DispatchQueue.main.async ---输入DO: 抓住错误! ---目录--- 无 ---错误---

可选(错误域=NSCOCAERRORDOMAIN Code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。})
因此,在调用此函数后,如何返回JSon字符串以查看注册是否正常或注册是否有问题(在这种情况下,数据库中已经存在用户名)。我将答案从我的PHP服务器更改为数组。

删除可选添加的转义字符后,您的
responseString
将被括在双引号中。它是一个JSON字符串,包含JSON对象的文本表示形式——双重编码。我建议您重新配置您的PHP服务器,因为双重编码的JSON对服务器和客户端都是低效的,这会消耗更多的时间和空间。现在PHP服务器返回的数组结果是:responseString:“{\'exception\'”:false,\'success\':false,\'status\':-9,\'message\':\“此用户名已经存在!\”,“confirmMessage\”:“null\”,“html\:”空\“,\”数据\“:\”boblongueuil \“}”!DispatchQueue.main.async---输入DO:CATCH错误!可选(错误域=NSCOCAERRORDOMAIN Code=3840“JSON文本未以数组或对象开头,允许未设置片段的选项。”UserInfo={NSDebugDescription=JSON文本未以数组或对象开头,允许未设置片段的选项。})为什么让jsonDictionary:NSDictionary行有一个错误?如果您得到输出
responseString:“{…
print(“responseString:\(responseString)!”)
,(它不是
print(“responseString:\(responseString!)”
,但是如何打印它是不相关的)它的两端仍然包含双引号。请修复php端,否则您无法使用正确的JSON来处理代码。这正是我的php服务器返回的结果:$result=array('exception'=>false,'success'=>false,'status'=>-10,'message'=>'此电子邮件地址已存在于我们的系统中!','confirmMessage'=>'null','html'=>'null','data'=>$email);告诉PHP服务器端工程师,返回双重编码的JSON是一个糟糕的设计或错误,表明实现者技能低下,应该予以修复。