HTTP Post 请求 Swift 5,包含 JSON 个对象列表

HTTP Post Requests Swift 5 with List of JSON objects

你好,我正在使用 Swift 5 发出 HTTP POST 请求,请求 returns 一个 JSON 对象的列表,我认为这是导致我出错的原因,而且我似乎找不到解决方案,因为我已经搜索了几乎所有可以在 Whosebug 和 youtube 上找到的示例,以及 Apple 文档,尽管这看起来像是一个基本概念。 这是我的回复:

[
        {
        "_id": "---------------",
        "phone_number": "xxx-xxx-xxx"
        "first_name": "Name",
        "last_name": "LastName",
        "gender": "Female",
        "verified": true
    },
    {
        "_id": "---------------",
        "phone_number": "xxx-xxx-xxx"
        "first_name": "Name",
        "last_name": "LastName",
        "gender": "Female",
        "verified": true
    }
]

我用来发出 HTTP 请求的代码是:

        let url = URL(string: "URLString")!
        let json: [String:Any] = ["phone_number":phoneNumber]
        let session = URLSession.shared
        var request = URLRequest(url: url)
        request.httpMethod = "POST"

        do{
            request.httpBody = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
        }catch let error {
            print(error.localizedDescription)
        }

        //HTTP Headers
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")

        //URL data task
        let task = session.dataTask(with: request) { (data, response, error) in
            guard error == nil else{
                print("Error!")
                return
            }
            guard let data = data else{
                print("Error fetching data")
                return
            }

            do {
                guard let responseJSON = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any] else {
                    print("Unable to serialize response!") //FAILS HERE EVERY TIME
                    return
                }
                print(responseJSON)
                print("WOO made it!")
            }catch let error {
                print("Error with response!")
            }
        }
        task.resume()

我不确定到底是什么问题,但我已经指出它失败的地方,并且我已经尝试在它转换之前打印出数据只是为了确保它不为空并且它说像 2000 字节所以我知道它不是空的。我的猜测是有问题,因为它是对象列表的格式,而不是像大多数示例所示的那样只有一个对象。我也有一些问题,我的 HTTP 正文有时在我的快速服务器端为 nil,所以不确定我是否做错了那部分。但截至目前,我只想能够解析我的响应,这样我就可以开始调试其余部分了。感谢您的帮助。

您需要 [[String:Any]] 而不是 [String:Any]

guard let responseJSON = try JSONSerialization.jsonObject(with: data) as? [[String:Any]] else {
    print("Unable to serialize response!") //FAILS HERE EVERY TIME
    return
 }

但最好使用 JSONDecoder

 do {
    let res = try JSONdecoder().decode([Root].self,from:data)
 }
 catch {
   print(error)
 }

正确json

[
    {
        "_id": "---------------",
        "phone_number": "xxx-xxx-xxx",
        "first_name": "Name",
        "last_name": "LastName",
        "gender": "Female",
        "verified": true
    },
    {
        "_id": "---------------",
        "phone_number": "xxx-xxx-xxx",
        "first_name": "Name",
        "last_name": "LastName",
        "gender": "Female",
        "verified": true
    }
]

struct Root: Codable {
    let id, phoneNumber, firstName, lastName: String
    let gender: String
    let verified: Bool

    enum CodingKeys: String, CodingKey {
        case id = "_id"
        case phoneNumber = "phone_number"
        case firstName = "first_name"
        case lastName = "last_name"
        case gender, verified
    }
}