Swift 复杂的节点树 Json
Swift Node Tree to complex Json
我正在开发一个用 swift 编写的工具,需要将树导出到 json。我一直在遵循 Swift 描述的树方法 here 作为指南。
我使用以下代码创建了一棵树
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 的帖子,但我无法完全理解用这样的树来做这件事。任何帮助将不胜感激!
注意:我不需要漂亮的印刷品json。这只是为了这里的可读性
你只需要让 Node
符合 Encodable
。你需要做的唯一棘手的步骤是只编码 children
以防它有任何元素,否则只编码 value
。您还需要声明一个 CodingKey
一致性 enum
来告诉 Encodable
使用 JSON 键 name
对 value
属性 进行编码而不是 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"}]}]}
我正在开发一个用 swift 编写的工具,需要将树导出到 json。我一直在遵循 Swift 描述的树方法 here 作为指南。
我使用以下代码创建了一棵树
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 的帖子,但我无法完全理解用这样的树来做这件事。任何帮助将不胜感激!
注意:我不需要漂亮的印刷品json。这只是为了这里的可读性
你只需要让 Node
符合 Encodable
。你需要做的唯一棘手的步骤是只编码 children
以防它有任何元素,否则只编码 value
。您还需要声明一个 CodingKey
一致性 enum
来告诉 Encodable
使用 JSON 键 name
对 value
属性 进行编码而不是 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"}]}]}