【问题标题】:How to convert json array to objects array Alamofire?如何将 json 数组转换为对象数组 Alamofire?
【发布时间】:2020-07-23 11:24:53
【问题描述】:

我在 api 中有这样的数组:

[{
    data = "";
    datetime = "23.07.2020 12:09";
    id = 340593;
    status = "My current task is";
},...]

我已经创建了这样的结构:

struct RemarksModel {
    let id:Int
    let status,datetime:String
    let data:String?
}

我在这里提出要求:

AF.request(URLRequest(url:Pathes.init(endpoint: "notepad/\(noteModel?.id ?? 0)/documentation").resourseUrl),
                   interceptor: CallInterceptor.init(method:HTTPMethod.get)).responseJSON(completionHandler: { (response) in
                    print(response.description)
                    switch response.result{
                    case .success(let array):
                        let remarksData = array as? [RemarksModel]
                        
                        let json = response.data as? [RemarksModel]
                        
                        
                        print(json?.count)
                        
                        
//                        if remarksData?.count ?? 1 > 0{
//                            self.remarksArray += remarksData!
//                            self.tableView.reloadData()
//                        }
                        
                        
                    case .failure(let error):
                        print(error.localizedDescription)
                        
                    }
                    
                   })

问题是我无法将此数组转换为我的模型对象数组。当我尝试将所有接收到的数据添加到数组时,我的应用程序崩溃了,因为我的数组为零,尽管日志中有 json。也许我必须使用另一种方式将接收到的 json 数组转换为对象数组?

【问题讨论】:

    标签: arrays json swift


    【解决方案1】:

    您可以将Codable 协议添加到RemarksModel 并使用.responseData 而不是.responseJSON

    .responseData { response in
        switch response.result {
        case let .success(data):
            do {
                let result = try JSONDecoder().decode([RemarksModel].self, from: data)
                // success
            } catch {
                print("decoding error:\n\(error)")
                // error
            }
        case let .failure(error):
            // error
        }
    }
    

    【讨论】:

      【解决方案2】:

      确认RemarksModelCodable(或者只是Decodable)协议后,可以直接使用.responseDecodable函数代替.responseData.responseJSON

      .responseDecodable(of: [RemarksModel].self, queue: .main, decoder: JSONDecoder()) { (response) in
          switch response.result {
          case let .success(data):
              // success
              print(data)
          case let .failure(error):
              // error
              print(error.localizedDescription)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多