想象一个如下的数据结构,其中包含contents
一个已编码的 JSON 片段的值。
let partial = """
{ "foo": "Foo", "bar": 1 }
"""
struct Document {
let contents: String
let other: [String: Int]
}
let doc = Document(contents: partial, other: ["foo": 1])
期望的输出
组合数据结构应按contents
原样使用并进行编码other
。
{
"contents": { "foo": "Foo", "bar": 1 },
"other": { "foo": 1 }
}
使用Encodable
以下实现Encodable
编码Document
为 JSON,但它也重新编码contents
为字符串,这意味着它被包裹在引号中,并且所有"
引号都转义为\"
.
extension Document : Encodable {
enum CodingKeys : String, CodingKey {
case contents
case other
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(contents, forKey: .contents)
try container.encode(other, forKey: .other)
}
}
输出
{
"contents": "{\"foo\": \"Foo\", \"bar\": 1}",
"other": { "foo": 1 }
}
怎么可能encode
就这样通过contents
?