json - Swift 节点树到复杂的 Json

标签 json swift macos d3.js

我正在开发一个用 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 进行编码。您还需要声明一个符合 enumCodingKey 来告诉 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/

相关文章:

javascript - 在 spring Controller 中处理 json 对象

python - 值错误 : too many values to unpack when using itertuples() on pandas dataframe

ios - 设计和自定义 View Controller

.net - 为 mac 编写 .net 软件

android - 如何开发返回 JSON 数据的 Web 服务

java - 为什么 JSONObject 不编码我的类?

swift - 使用 Swift 3 按下时动画单元格

xcode - 在 Xcode 7.0 中获取框架相关警告

linux - GCC 在 Mac OS X 上编译程序,但在 Ubuntu 上不编译程序

python 幽灵脚本 : RuntimeError: Can not find Ghostscript library (libgs)