我正在开发一个用 swift 编写的工具,需要将树导出为 json。我一直在遵循 here 描述的 Swift 树方法作为指导。
我使用以下代码创建一棵树
class Node {
var value: String
var children: [Node] = []
weak var parent: Node?
init(value: String) {
self.value = value
}
func add(child: Node) {
children.append(child)
child.parent = self
}
}
let beverages = Node(value: "beverages")
let hotBeverages = Node(value: "hot")
let coffee = Node(value: "coffee")
let coldBeverages = Node(value: "cold")
let water = Node(value: "water")
let soda = Node(value: "soda")
beverages.add(child: hotBeverages)
hotBeverages.add(child: coffee)
beverages.add(child: coldBeverages)
coldBeverages.add(child: water)
coldBeverages.add(child: soda)
现在我需要将此代码导出为 json。我将它传递到 webkit 中,这样我就可以加载 hierarchal tree via D3 。这意味着我需要将其导出,以便它符合以下格式...
[
{
"name": "beverages",
"children": [
{
"name": "cold",
"children": [
{"name": "water"},
{"name": "soda"}
]},
{
"name": "warm",
"children": [
{"name": "coffee"}
]
}]
}
]
我看过很多关于将 swift 导出到基本 json 的帖子,但无法完全理解如何使用这样的树来完成它。任何帮助将不胜感激!
注意:我不需要 pretty-print json。这只是为了便于阅读
最佳答案
您只需使 Node
符合 Encodable
即可。您需要做的唯一棘手的步骤是仅在 children
有任何元素的情况下对其进行编码,否则仅对 value
进行编码。您还需要声明一个符合 enum
的 CodingKey
来告诉 Encodable
使用 JSON 键对 value
属性进行编码名称
而不是值
。
extension Node: Encodable {
private enum CodingKeys: String, CodingKey {
case value = "name"
case children
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(value, forKey: .value)
if !children.isEmpty {
try container.encode(children,forKey: .children)
}
}
}
然后像这样使用它
do {
let encodedBevarages = try JSONEncoder().encode(beverages)
print(String(data: encodedBevarages, encoding: .utf8) ?? "Encoding failed")
} catch {
error
}
输出:
{"name":"beverages","children":[{"name":"hot","children":[{"name":"coffee"}]},{"name":"cold","children":[{"name":"water"},{"name":"soda"}]}]}
关于json - Swift 节点树到复杂的 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68456249/