我设法序列化到可编码对象的数据的响应。
例如,您可能已经熟悉转换json对象[String: String]
。该json对象需要使用json.data(using: .utf8)!
转换为Data
。
随着Alamofire,很容易获得这些数据(或者至少这类数据的工作对我来说,已经与.utf8
东西兼容),我就可以用这个已经存在的功能
func responseData(queue: DispatchQueue?, completionHandler: @escaping (DataResponse<Data>) -> Void) -> Self
然后,只需使用该数据作为输入的Decoder
在completionHandler
let objek = try JSONDecoder().decode(T.self, from: data)
您也可以让这对一些通用的序列化功能,具有小调整,从文档
Generic Response Object Serialization
此修改
func responseCodable<T: Codable>(
queue: DispatchQueue? = nil,
completionHandler: @escaping (DataResponse<T>) -> Void)
-> Self
{
let responseSerializer = DataResponseSerializer<T> { request, response, data, error in
guard error == nil else { return .failure(BackendError.network(error: error!)) }
guard let data = data else {
return .failure(BackendError.objectSerialization(reason: "data is not valid"))
}
do{
let objek = try JSONDecoder().decode(T.self, from: data!)
return .success(objek)
} catch let e {
return .failure(BackendError.codableSerialization(error: e))
}
}
return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)
}
样品结构
struct Fids: Codable {
var Status: Status?
var Airport: Airport?
var Record: [FidsRecord]
}
使用功能这样
Alamofire.request("http://whatever.com/zzz").responseCodable { (response: DataResponse<Fids>) in
switch response.result{
case .success(let value):
print(value.Airport)
// MARK: do whatever you want
case .failure(let error):
print(error)
self.showToast(message: error.localizedDescription)
}
}
是你的问题是如何改变您到所提供的JSON数组Person(示例实体)?还是一个异构对象的数组? – nathan
那么我知道如果我有'{“名字”:“汤姆”,“姓氏”:“史密斯”,“年龄”:31}'和一个人类我可以将JSON转换成Swift中的个人对象使用可编码。但是我不确定如果我拥有从Alamofire获得的JSON数组,我该如何做到这一点。 –
我对Alamofire(或者这个库)并不熟悉,但是有https://github.com/Otbivnoe/CodableAlamofire –