【问题标题】:Issue while sending array of dictionary in swift快速发送字典数组时出现问题
【发布时间】:2020-06-09 23:07:45
【问题描述】:

我正在创建字典数组,然后将其传递到 paramDictionary 并发送到服务器,但我得到 responseStatus 代码 422。我正在使用 Alamofire 5。

这是我必须发送的参数结构,它在邮递员上成功运行,但在应用程序中总是失败

{"check_in": [{"check_in_at":"2020-02-26 03:23:44", "gps_coordinates":"3.1697998046875,101.61672197976593"}, 
{"check_in_at":"2020-02-26 03:23:45","gps_coordinates":"3.1697998046875,101.61672197976593"}]}

这是我的代码

func postCheckInApi(viewController: UIViewController,
                          completion:@escaping (_ result:SuccessErrorData)->(),
                          errorHandler:@escaping (_ result:Error,_ statusCode:Int?)->()//error handler
) {

    let url = KCheckin
    let geoArr = Constant.getSearchLocationHistory() ?? [GeoTaggingEntity]()
    var arr = [[String: String]]()

    for i in geoArr{
        let dict: [String : String] = ["gps_coordinates" : i.gps_coordinates ?? "", "check_in_at" : i.check_in_at]
        arr.append(dict)
    }
    let parameterDictionary = ["check_in": arr] as [String : Any]
    print(parameterDictionary)
    let headers: HTTPHeaders = [
        "Accept": "application/json",
        "Content-Type": "application/json",
        "Authorization": Constant.getBearerToken() ?? ""
    ]

    AF.request(url, method: .post, parameters: parameterDictionary, headers: headers).responseData { response in
        switch response.result{
        case.success(let data):
            do{
                let jsonData = try JSONDecoder().decode(SuccessErrorData.self, from: data)
                print("Success")
                completion(jsonData)
            }
            catch{
                //viewController.navigationController?.popToRootViewController(animated: true)
            }
        case .failure(let error):
            print(error)
        }
    }
}

【问题讨论】:

  • 我在您的字典中看不到 check_in_at 键,同时将其添加到数组中。请同时添加该密钥
  • 能否请您出示print(parameterDictionary)的回复
  • @Gyanendra 这里是“让 dict: [String : String] = ["gps_coordinates" : i.gps_coordinates ?? "", "check_in_at" : i.check_in_at]"
  • @Manoj。这里是 ["check_in": [["gps_coordinates": "3.170011520385742,101.61671682755713", "check_in_at": "2020-02-26 07:02:44"], ["check_in_at": "2020-02-26 07 :02:45", "gps_coordinates": "3.170011520385742,101.61671682755713"]]]
  • 您可以在 POSTMAN 中完成您的请求吗?如果是这样,您可以要求 POSTMAN 为您获取 Swift 代码(错误代码,但您可以找到差异),或者您可以使用 POSTMAN 生成 Alamofire 也可以翻译的curl 代码。卷曲比较:stackoverflow.com/questions/53637437/alamofire-with-d/…

标签: ios swift api alamofire


【解决方案1】:

您不能将Array 作为参数对象添加到您的paramDictionary。您需要将您的Array 转换为json string,然后将其添加给您paramDictionary

对于使用下面的Collection 扩展名将您的Array 转换为Json String

extension Collection {
    func json() -> String? {
        guard let data = try? JSONSerialization.data(withJSONObject: self, options: []) else {
            return nil
        }
        return String(data: data, encoding: String.Encoding.utf8)
    }
}

如何使用

let jsonStr = yourArray.json()

将此 jsonStr 添加到您的 paramDictionary

【讨论】:

  • 让 parameterDictionary = ["check_in": arr.json()]// as [String : Any] print(parameterDictionary as Any) ["check_in": Optional("[{\"check_in_at\ ":\"2020-02-26 13:59:47\",\"gps_coordinates\":\"3.1390933990478516,101.6148388824553\"},{\"gps_coordinates\":\"3.1390933990478516,101.6148388_\824","check \":\"2020-02-26 13:59:47\"}]")] Got Error: check in must be an array
猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多