正确格式化Swift 3中的JSON对象

时间:2017-03-01 19:26:15

标签: ios json node.js swift swift3

我在运行Node.js的服务器上以正确格式获取JSON对象时遇到问题。我设置了API以接收JSON对象并将其存储在数据库中。当我从邮递员发送POST请求时,这很有用(如下所示),但是当我从iOS发送它时会抛出一个奇怪的错误。举个例子:

enter image description here

显示的第一个json对象是邮递员发送的。第二个来自iOS(使用Swift 3)。该错误实质上崩溃了服务器,说:

AssertionError: Error: key          {"firstname":"testFirstName","lastname":"testLastName","email":"testemail123@gmail.com","username":"testusername123", == null

我不确定为什么会这样。我假设它与对象的创建方式有关?这是我用来创建对象的快速代码:

let infoDictionary = [
            "username":  UserNameField.text!,
            "password":  PasswordField.text!,
            "firstname": FirstNameField.text!,
            "lastname":  LastNameField.text!,
            "email":     EmailField.text!
        ]

        // Whole block = send above dictionary as JSON to server:
        if JSONSerialization.isValidJSONObject(infoDictionary) {
            do {
                let jsonObject = try JSONSerialization.data(withJSONObject: infoDictionary,
                                                            options: .prettyPrinted)

然后我将它附加到http正文。请注意,这些字段来自应用程序的UI中的文本字段,我将其解包并放入字典中。当我在swift中将其作为字符串打印出来时,它以正确的格式出现,当我真正将其发送到我的服务器时,出现了一些问题。

编辑:每个请求的完整网址请求如下:

do {
                let jsonObject = try JSONSerialization.data(withJSONObject: infoDictionary,
                                                            options: .prettyPrinted)
                // Create Post request
                let url = URL(string: "websiteurl")
                var request = URLRequest(url: url!)
                request.httpMethod = "POST"

                // Append JSON object
                request.httpBody = jsonObject

                // Send request
                let task = URLSession.shared.dataTask(with: request) { data, response, error in
                    guard let data = data, error == nil else {
                        print(error?.localizedDescription ?? "No Data")
                        return
                    }
                    let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
                    if let responseJSON = responseJSON as? [String: Any] {
                        print(responseJSON)
                    }
                }
                task.resume() // Sends the request
            } catch {
                print(error.localizedDescription)
            }
        }

1 个答案:

答案 0 :(得分:1)

请求正文很好,它包含一个有效的JSON对象,但是 显然,服务器将HTTP主体解释为 string 并包装 它进入另一个JSON对象。请注意" text / plain"是默认值 HTTP请求的内容类型(https://tools.ietf.org/html/rfc2045#section-5.2)。

解决方案是明确设置内容类型:

{{1}}