Swift Codable Map Children by ID

标签 swift codable

我有以下代码。

import Foundation

let jsonData = """
[
    {"id": "1", "firstname": "Tom", "lastname": "Smith", "age": "28"},
    {"id": "2", "firstname": "Bob", "lastname": "Smith"},
    {"id": "3", "firstname": "Jim", "lastname": "Smith", "parentid": "2"},
    {"id": "4", "firstname": "Ray", "lastname": "Smith", "parentid": "3"}
]
""".data(using: .utf8)!

class Person: Codable {
    let id: String
    let firstName, lastName: String
    let age: String?
    let parentid: String?
    let children: [Person]?

    enum CodingKeys : String, CodingKey {
        case firstName = "firstname"
        case lastName = "lastname"
        case age
        case parentid
        case id
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        firstName = try values.decode(String.self, forKey: .firstName)
        lastName = try values.decode(String.self, forKey: .lastName)
        age = try values.decodeIfPresent(String.self, forKey: .age)
        parentid = try values.decodeIfPresent(String.self, forKey: .parentid)
        id = try values.decodeIfPresent(String.self, forKey: .id)
    }

}

let decoded = try JSONDecoder().decode([Person].self, from: jsonData)
print(decoded)

所以我有 children 属性。我基本上希望 decoded 是一个包含 2 个 Person 对象(Tom 和 Bob)的数组。 decoded[1].children 应该是一个包含 1 个 Person 对象 (Jim) 的数组。 decoded[1].children[0] 应该是一个包含 1 个 Person 对象 (Ray) 的数组。

如何使用 Swift Codable 系统实现这一目标?

最佳答案

你可以这样做:

    if let decoded = try? JSONDecoder().decode([Person].self, from: jsonData)
    {
        for person in decoded
        {
            person.children = decoded.filter({ (child) -> Bool in
                return person.id == child.parentid
            })
        }
    }

在上面的代码中,在获得解码数组后,我只是使用for循环遍历它来识别每个children 如果存在的话。

关于Swift Codable Map Children by ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545933/

相关文章:

swift - 如何使用包含自动布局按钮的 ScrollView

swift - 使用 Swift 将可编码结构保存到 UserDefaults

swift - 解码子级时访问嵌套 Codable 结构中父结构的属性

ios - UISliders 和 UILabels 和 viewControllers

ios - Xcode 9 没有这样的模块 'Facebook Login'

swift - 删除类型的可编码一致性?

swift - 使枚举(具有关联类型)可编码,成功

ios - 此日期时间响应的正确格式是什么

ios - 制定警报重复天数列表

swift - 如何使用 Combine 跟踪 UIViewRepresentable 类中的 UITextField 更改?