ios - 使用 Codable 或 ObjectMapper 映射通用 API 响应
问题描述
我在使用可编码或对象映射器将通用 api 响应映射到模型类方面面临挑战。假设我有针对不同 api 的这些 api 响应。
{
"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
必须符合Decodable
然后使用这个类型来指定类型data
struct APIResponse<T: Decodable>: Decodable {
var code, httpResponse: Int
var success: Bool
var data: T
}
struct User: Decodable {
var name: String
}
请注意,我更改了httpResponse
参数的名称,因为我使用keyDecodingStrategy
的是转换http_response
为httpResponse
然后在解码时指定类型T
单个对象
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let responses = try decoder.decode([APIResponse<User>].self, from: data)
let user = responses[0].data /* data of type `User` of specific response */
} catch { print(error) }
对象数组
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) }
推荐阅读
- c# - 添加对我们项目的引用后出现 WPF InitializeComponent() 错误
- node.js - 当将 docker 容器上托管的 cassandra 与 nodejs 连接时,得到 NoHostAvailableError: No host could be resolve
- webrtc - 是否可以在不配置领域的情况下拥有转弯服务器?
- flutter - 如何将信息从一个屏幕传递到另一个屏幕
- reactjs - next js 中的嵌套路由
- python - 是否可以在 nogil 部分使用 Cython 扩展类型?
- bash - 直接在运行过程中发送命令和间接发送命令(例如使用tail)
- javascript - 从 html 生成可保存图像的最佳方法是什么?
- r - 如何绘制ggplotly和类“c('chorddiag','htmlwidget')”一起绘制
- python - ModuleNotFoundError:没有名为“learning_logsdjango”的模块