Swift可编码映射子项(按ID)

Swift可编码映射子项(按ID),swift,codable,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"},

我有以下代码

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)
所以我有了
孩子
属性。我基本上希望
解码的
是一个包含2个
对象(汤姆和鲍勃)的数组<代码>已解码[1]。子项应该是一个包含1
个人
对象(Jim)的数组。和
decoded[1]。子项[0]
应该是一个包含1
Person
对象(光线)的数组


如何使用Swift编码系统实现这一点?

您可以执行以下操作:

    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循环
遍历它,以识别每个
人的
子项
(如果存在)。

lol。你真有趣。我的答案是如此之大,以至于在评论中写下它的主体。不是每个问题都有答案solution@Vyacheslav你知道那不是真的。你可以在编码方面做任何事情。可能需要以不同的方式思考问题。但我从来没有见过这样的情况:给定一个输入,就不可能得到预期的输出。如果可能的话,如果有人(也许是你)回答你的问题那就太好了question@Vyacheslav也许我问这个是有原因的?如果我能自己回答,我为什么要问?我目前正在尝试让它在可编码系统之外工作。对输出数组进行排序并移动元素等。编码的一部分是解决问题。总有你必须解决的问题。我很震惊,你没有意识到这一点,并愿意这么快放弃。如果你想很快放弃,那么你不需要回答问题或评论。太棒了。那么如何得到最终数组?Decoded是执行for循环后得到的最终数组。只需在for循环完成后打印解码。好的,所以最好事先创建一个单独的变量来存储最终结果。谢谢当然,快乐的编码