swift - 在 Swift 中以正确的方式从 URLSession 解码原始数据
问题描述
我的 API 中大多数端点的响应是这样的 -
{
"status":"success",
"data":[
{
"id":"1",
"employee_name":"Tiger Nixon",
"employee_salary":"320800",
"employee_age":"61",
"profile_image":""
},
{
"id":"2",
"employee_name":"Garrett Winters",
"employee_salary":"170750",
"employee_age":"63",
"profile_image":""
}
]
}
这就是我的 Employee 模型的样子
struct Employee: Codable {
let id, employeeName, employeeSalary, employeeAge: String
let profileImage: String?
enum CodingKeys: String, CodingKey {
case id
case employeeName = "employee_name"
case employeeSalary = "employee_salary"
case employeeAge = "employee_age"
case profileImage = "profile_image"
}
}
typealias Employees = [Employee]
我只想使用提取API响应的数据部分JSONDecoder
并将其传递给我的完成处理程序
completionHandler(try? JSONDecoder().decode(Employees.self, from: data), response, nil)
我能够通过创建这样的结构Employees来解决 -
struct Employees: Codable {
let status: String
let data: [Employee]
}
但这只是一种解决方法,我几乎必须为每个模型都这样做。那么有没有更好、更少冗余的方法来从响应中提取数据呢?
解决方案
如果我是你,我会做的只是创建一个基于模板的包装器并将其用于所有模型对象。
struct ModelWrapper<T: Codable>: Codable {
let status: String
let data: [T]
}
let decoder = JSONDecoder()
let wrapper = try decoder.decode(ModelWrapper<Employee>.self, from: json)
推荐阅读
- regex - 使用 grep 搜索以不同“形状”书写的三个单词
- javascript - 在 RSK Regtest 上开发时如何提高块号?
- mysql - 使用删除查询从 mySQL 数据库中删除问题(未找到 404)
- ios - 强制换行位置
- css - 合并两个具有相同渐变背景的 div
- openstack - 如何在 Openstack Kolla 中配置 Octavia?
- git - github cli 多个帐户
- html - Flask 下载 zip 文件:失败 - 没有文件
- python - 我的项目基于多图像。它没有在前端显示图像
- javascript - 如何在 vue js 中获取 ion-radio 值 - ionic