使用 Alamofire 5 快速解析使用

Posted

技术标签:

【中文标题】使用 Alamofire 5 快速解析使用【英文标题】:Parsing using in swift using Alamofire 5 【发布时间】:2020-02-21 16:22:08 【问题描述】:

我正在尝试解析这个 api 响应,但我收到了这个错误

“无法将类型 '__NSDictionaryI' (0x1e06425d8) 的值转换为 'NSData' (0x1e06418e0)"

。这是我的代码、api 响应和模型类。

class func getCityApi(viewController: UIViewController,
                      completion:@escaping (_ result:[CityDetails])->(),
                      errorHandler:@escaping (_ result:Error,_ statusCode:Int?)->()
) 

    AF.request(KCity, method: .get, parameters: nil, headers: nil).responseJSON  response in
        switch response.result
        case.success(let data):
            do
                let jsonData = try JSONDecoder().decode(City.self, from: data as! Data)
                print(jsonData)
                completion(jsonData.data)
            
            catch

            

        case .failure(let error):
            print(error.localizedDescription)
        
    

Api 响应结构

模型类

struct City: Codable 
  var data: [CityDetails]
  var status: Bool
  var message: String


struct CityDetails: Codable
  var id: Int
  var location: String

【问题讨论】:

【参考方案1】:

您需要Data 回复。替换

AF.request(KCity, method: .get, parameters: nil, headers: nil).responseJSON  response in

AF.request(KCity, method: .get, parameters: nil, headers: nil).responseData  response in

let jsonData = try JSONDecoder().decode(City.self, from: data as! Data)

let jsonData = try JSONDecoder().decode(City.self, from: data)

【讨论】:

先生更换后进入catch块。 那么这是Decoding 的问题。在catch 块中打印error 实例(不是它的localizedDescription 更正其解码问题。谢谢先生.. :)【参考方案2】:
let jsonData = try JSONDecoder().decode(City.self, from: data as! Data)

改成

let jsonData = try JSONDecoder().decode(City.self, from: data as! Dictionary<String,Any>)

【讨论】:

【参考方案3】:

如果你已经有Decodable类型,你可以直接使用responseDecodable,不需要自己解析响应:

AF.request(KCity).responseDecodable(of: City.self)  response in
    // response is DataResponse<City, AFError>

您可以通过阅读 Alamofire 的 Usage documentation 了解更多信息。

【讨论】:

以上是关于使用 Alamofire 5 快速解析使用的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 快速接收并解析字符串数组

快速解析 Alamofire 结果

使用 alamofire 在 Swift 上解析 Json

如何在 Swift 5 中使用 Alamofire 解析 json

Xcode:Alamofire 源代码中的 Swift Dropbox 错误

这个块在 Swift - Alamofire 中是啥意思?