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]
应该是一个包含1Person
对象(光线)的数组
如何使用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循环完成后打印解码。好的,所以最好事先创建一个单独的变量来存储最终结果。谢谢当然,快乐的编码