通过符合Decodable
的Swift类型安全解码非常棒。有一个特别好的教程here,其中涵盖了基础知识,然后继续介绍一些更深层次的细节。
但是,我有一个层次结构,我想以一种类型安全的方式进行解码,但是在层次结构的某些嵌套节点中,我想捕获底层的JSON,以便可以将其传递给其他服务。
我的代码此时不应该理解基础数据的架构。它需要捕获JSON(作为String
或Data
或[String:Any]
),以便以后可以传递。我的代码将数据视为具有未知架构的不透明Blob。
因此,我需要一种机制来从类型安全分析中“退出”并按原样获取一些原始数据。
这是我的意思(非常)简化的例子……
struct TopLevelThing: Decodable {
let nestedStuff: [NestedThing]
}
struct NestedThing: Decodable {
let id: Int
let detail: FreeformJSON
}
我希望能够解码JSON,例如……
{
"nestedStuff": [
{
"id": 321,
"detail": {
// Lots of stuff in here that's just captured, not parsed.
"area": "floo bar"
}
},
{
"id": 123,
"detail": {
// Lots of stuff in here that's just captured, not parsed.
"filbur": "it makes sense, really"
}
}
]
}
我还没有找到一种方法来“突破” Decodable
提供的安全解析类型。我可以为init(from: Decoder) throws
编写自定义NestedThing
,但是我还没有找到从Decoder
获取基础JSON的方法。
我也可以使用JSONSerialiser
手动解码JSON,但是放弃所有类型安全的东西来实现此目标似乎很可耻。