字典到 JSON 在 swift 3 中被序列化两次

Posted

技术标签:

【中文标题】字典到 JSON 在 swift 3 中被序列化两次【英文标题】:Dictionary to JSON being serialised twice in swift 3 【发布时间】:2017-06-05 11:35:14 【问题描述】:

我正在尝试使用以下转换为 JSON 的字典发出发布请求

    let store = [
        "newTask" : [
            "project_name": "ios",
            "total_time":0,
            "color":"blue"
        ]
    ]

我正在使用以下代码对其进行序列化,然后使用以下选项发出 http-POST 请求:

        let jsonData = try? JSONSerialization.data(withJSONObject: store)

        var request = URLRequest(url: URL(string: "http://localhost:3000/store")!)
        request.httpMethod = "POST"
        request.httpBody = jsonData

我也在运行一个带有以下 db.json 文件的 json-server https://github.com/typicode/json-server


 "store": [
  
    "id": 0,
    "ios": 
      "project_name": "iOS",
      "total_time": 0,
      "color": "blue"
    
  ,
  
    "id": 1,
    "elm": 
      "project_name": "elm",
      "total_time": 0,
      "color": "blue"
    
  
]

我遇到的问题是数据库中新添加的项目看起来不正确,格式如下:


  "\"newTask\":\"project_name\":\"iOS\",\"total_time\":0,\"color\":\"blue\"": "",
  "id": 10
,

我不确定为什么它将整个字典序列化为键,然后将空字符串序列化为值。

更新

这是将其发布到服务器的代码:

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)")
                    return
                

                if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200            // check for http errors
                    print("statusCode should be 200, but is \(httpStatus.statusCode)")
                    print("response = \(response)")
                

                do 
                    if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] 
                        print(json)



                    

                 catch let error 
                    print(error.localizedDescription)
                

            
            task.resume()

作为旁注,我尝试通过邮递员将其固定,并且一切正常ok。在下面附上它的屏幕截图。

任何帮助将不胜感激,谢谢!

【问题讨论】:

@EricAya 感谢您如此迅速地取得联系!我已经更新了上面的帖子,并发布了 http 请求的更新,并解释了邮递员上的相同请求可以正常工作。 @EricAya 我已经更改了它,以便密钥名称完全相同。它似乎在邮递员上工作正常。问题很可能与 HTTP 请求或正在发生的序列化有关。 【参考方案1】:

当你构造你的 URLRequest 时,这条线会为你修复它吗?

    request.setValue("application/json", forHTTPHeaderField: "Content-Type")

在 Postman 中,您将其作为 application/json 发送,因此我希望您需要在 swift 代码中执行相同操作。

【讨论】:

完美!没有意识到这一点。我继续查看响应,响应类型设置为 application/json,因此认为 post 请求属于同一类型。这为我解决了! :tada: 谢谢!

以上是关于字典到 JSON 在 swift 3 中被序列化两次的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中解析来自 URL 的 JSON 数据

swift 3中从数组到字典的JSON解析问题

在 Swift 3 中将 JSON 字符串转换为字典

如何将 Swift 对象序列化或转换为 JSON?

Swift 3 JSONSerialization 序列化字典包含 \ 字符

swift: 字典到 json