Ios 使用Codable或ObjectMapper映射通用API响应
我面临着一个挑战,就是如何使用codable或objectmapper将通用api响应映射到模型类。假设我有这些针对不同api的api响应Ios 使用Codable或ObjectMapper映射通用API响应,ios,swift,mapping,codable,objectmapper,Ios,Swift,Mapping,Codable,Objectmapper,我面临着一个挑战,就是如何使用codable或objectmapper将通用api响应映射到模型类。假设我有这些针对不同api的api响应 { "code" : 0, "http_response" : 200, "success" : true, "data" : user } { "code" : 0, "http_response" : 200, "success" : true, "data" : locations } { "code"
{
"code" : 0,
"http_response" : 200,
"success" : true,
"data" : user
}
{
"code" : 0,
"http_response" : 200,
"success" : true,
"data" : locations
}
{
"code" : 0,
"http_response" : 200,
"success" : true,
"data" : countries
}
在这里,用户、地点和国家是单独的可编码/映射类
我必须构造一个这样的类
struct APIResponse : Codable {
let success : Bool?
let http_response : Int?
let code : Int?
let data : ??
}
我将如何构造我的基类来使用一个类处理这些响应,或者我将构造不同的类来根据值更改“数据”类型
任何形式的帮助或建议都将不胜感激
感谢为您的结构创建泛型约束,该约束表示
T
必须符合可解码
,然后使用此类型指定数据的类型
struct APIResponse<T: Decodable>: Decodable {
var code, httpResponse: Int
var success: Bool
var data: T
}
struct User: Decodable {
var name: String
}
对象数组
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let responses = try decoder.decode([APIResponse<[User]>].self, from: data)
let users = responses[0].data /* data of type `[User]` of specific response */
} catch { print(error) }
let decoder=JSONDecoder()
decoder.keyDecodingStrategy=.convertFromSnakeCase
做{
let responses=try decoder.decode([APIResponse].self,from:data)
让用户=响应[0]。特定响应的“[User]”类型的数据/*数据*/
}捕获{打印(错误)}
考虑到用户
,国家
,位置
是可解码的,您的解码方法和APIResponse
将如下所示
struct APIResponse<T: Decodable>: Decodable {
var data: T?
var code: Int
var success: Bool
var http_response: Int
}
func decode<T: Decodable>(data: Data, ofType: T.Type) -> T? {
do {
let decoder = JSONDecoder()
let res = try decoder.decode(APIResponse<T>.self, from: data)
return res.data
} catch let parsingError {
print("Error", parsingError)
}
return nil
}
struct APIResponse<T: Decodable>: Decodable {
var data: T?
var code: Int
var success: Bool
var http_response: Int
}
func decode<T: Decodable>(data: Data, ofType: T.Type) -> T? {
do {
let decoder = JSONDecoder()
let res = try decoder.decode(APIResponse<T>.self, from: data)
return res.data
} catch let parsingError {
print("Error", parsingError)
}
return nil
}
let data = Data() // From the network api
//User
let user = decode(data, ofType: User.self)
// Countries
let countries = decode(data, ofType: [Country].self)
// Locations
let locations = decode(data, ofType: [Location].self)