首先让我们将您的 json 转换为 Data 值
let data = """
[
{
"id": 1,
"type": "employee",
"employee_name": "xy"
},
{
"id": 2,
"type": "employer",
"employer_name": "xz"
}
]
""".data(using: .utf8)!
重要提示:替换“!”使用更安全的展开方法
型号
现在我们需要一个模型值来匹配 JSON 中的元素
struct ResponseElement:Codable {
let id: Int
let type: Type
let employeeName: String?
let employerName: String?
enum CodingKeys: String, CodingKey {
case id, type, employeeName = "employee_name", employerName = "employer_name"
}
enum `Type`:String, Codable {
case employee, employer
}
}
如您所见,employeeName 和 employerName 是可选项,因此该结构将能够保存 JSON 的每个元素(Employers 和 Employee)。
Person 及其子类
假设您有这样的课程Person
class Person {
let id: Int
let name:String
init(id:Int, name:String) {
self.id = id
self.name = name
}
}
您需要像这样创建 Employee 和 Empolyer 子类
class Employee:Person {
init?(responseElement:ResponseElement) {
guard let name = responseElement.employeeName, responseElement.type == .employee else { return nil }
super.init(id: responseElement.id, name: name)
}
}
class Employer:Person {
init?(responseElement:ResponseElement) {
guard let name = responseElement.employerName, responseElement.type == .employer else { return nil }
super.init(id: responseElement.id, name: name)
}
}
请注意,Employee 有一个可失败的初始化程序,它将尝试从 ResponseElement 创建一个 Employee。 Employer 也一样。
让我们解码!
do {
let elements = try JSONDecoder().decode([ResponseElement].self, from: data)
let employees = elements.filter { $0.type == .employee }.flatMap(Employee.init)
let employers = elements.filter { $0.type == .employer }.flatMap(Employer.init)
print(employees.count)
print(employers.count)
} catch {
print("Something bad has happened ?:\(error)")
}