【问题标题】:HTTP Post Requests Swift 5 with List of JSON objects带有 JSON 对象列表的 HTTP Post 请求 Swift 5
【发布时间】:2020-05-21 00:04:14
【问题描述】:

您好,我正在使用 Swift 5 发出 HTTP POST 请求,该请求返回一个 JSON 对象列表,我认为这是导致我的错误的原因,我似乎找不到解决方案,因为我已经搜索了几乎每个示例可以在 stackoverflow 和 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 正文也为零,因此不确定我是否做错了那部分。但截至目前,我只想能够解析我的响应,所以我可以开始调试其余部分。感谢您的帮助。

【问题讨论】:

    标签: json swift express serialization httprequest


    【解决方案1】:

    您需要[[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
        }
    }
    

    【讨论】:

    • 非常感谢!!这么一个小问题救了我!真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多