我从数据递归的服务器接收 JSON。将其解析为方便的 Swift 数据结构的最佳方法是什么?
定义 Swift Codable 数据结构来解析它失败,因为不允许递归属性。
Swift 编译器报告:“值类型‘FamilyTree.Person’不能有递归包含它的存储属性”
{
"familyTree": {
"rootPerson": {
"name": "Tom",
"parents": {
"mother": {
"name": "Ma",
"parents": {
"mother": {
"name": "GraMa",
"parents": {}
},
"father": {
"name": "GraPa",
"parents": {}
}
}
},
"father": {
"name": "Pa",
"parents": {}
}
}
}
}
}
理想情况下,最终结果是一堆从 rootPerson 对象开始指向其母亲和父亲对象的 person 对象。
第一个想法是创建如下结构:
struct Person: Codable {
var name: String
var parents: Parents
}
struct Parents: Codable {
var mother: Person?
var father: Person?
}
但这是行不通的,因为你不能像这样递归存储属性。
这是一种可能的工作解决方案:
let json = """
{
"familyTree": {
"rootPerson": {
"name": "Tom",
"parents": {
"mother": {
"name": "Ma",
"parents": {
"mother": {
"name": "GraMa",
"parents": {}
},
"father": {
"name": "GraPa",
"parents": {}
}
}
},
"father": {
"name": "Pa",
"parents": {}
}
}
}
}
}
"""
struct Person: Codable {
var name: String
var parents: [String: Person]
}
struct FamilyTree: Codable {
var rootPerson: Person
}
struct Root: Codable {
var familyTree: FamilyTree
}
let decoder = JSONDecoder()
let tree = try decoder.decode(Root.self, from: json.data(using: .utf8)!)
print(tree)
在 Playground 中,这将正确解析 JSON。
The parents
的字典Person
将有诸如"mother"
and "father"
。这支持一个人有任意数量的父母担任任何角色。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)