【发布时间】:2019-04-15 15:03:06
【问题描述】:
我正在尝试使树数据结构遵循可编码协议。树终止于遵守协议“终端”的“某个对象”。终端扩展了 Codable。
树的每个节点都是一对。它有一个键和一个值。该值可以是一对,也可以是一个终端。
主要有两个问题:
1) 我希望这个结构能够编码为 JSON,这样
class Pair: Codable {
var key: String?
var value: Codable?
}
let outputSimple = Pair(key: "a test key", value: "a test value")
// encodes to
// {"a test key": "a test value"}
// whereas currently encodes to
// {}
let outputComplex = Pair(key: "a parent", value: Pair(key: "another pair", value: "a test value"))
// encodes to
// {"a parent": {"another pair", "a test value"}}
编辑:第 2 部分可能会稍微混淆这个问题。为了澄清上述问题,如果我有
class Pair: Codable {
var key: String
var value: String
}
let p = Pair(key:"foo", value: "bar")
我怎样才能让它输出 {"foo":"bar"} 而不是 {key:foo, value:bar}?我试过了
override func encode(to encoder: Encoder) throws {
var container = encoder.unkeyedContainer()
container.encode(contentsOf: [key: value])
}
但得到错误“实例方法'encode(contentsOf:)'要求'(key: _, value: _)'符合'Encodable'”
2) 我正在尝试以下操作,但它似乎不起作用。我得到“对不符合协议'Decodable'”
protocol TreeNode: Codable {}
struct Pair: TreeNode {
var key: String?
var value: TreeNode?
}
extension String: TreeNode {}
我可以通过将 TreeNode 设为一个类和 Pair 一个子类来解决这个问题。这也可能是正确的 Swift 行为。但是,我想知道是否有更多双眼睛可以解释这个问题。我假设只要我确保所有值都是类型对,或者其他遵循 Codable 的类型,那么它就可以工作。
【问题讨论】:
-
查看GenericJSON 以使用
Codable创建动态、类型安全的 JSON。您可以简化它以满足您对Tree/Pair的需求。 -
谢谢。这就是我正在采用的方法,但它涉及将终端节点包装在一个类中。该类的编码方法然后执行 GenericJSON 样式编码
标签: json swift parsing codable