首页 > 解决方案 > 在 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]
}

但这只是一种解决方法,我几乎必须为每个模型都这样做。那么有没有更好、更少冗余的方法来从响应中提取数据呢?

标签: swiftswift5urlsessionjsondecoder

解决方案


如果我是你,我会做的只是创建一个基于模板的包装器并将其用于所有模型对象。

struct ModelWrapper<T: Codable>: Codable {
    let status: String
    let data: [T]
}
let decoder = JSONDecoder()
let wrapper = try decoder.decode(ModelWrapper<Employee>.self, from: json)

推荐阅读