使用 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 快速解析使用的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 5 中使用 Alamofire 解析 json