我有这个json:
{ "stuff": [
{
"type":"car",
"object":{
"a":66,
"b":66,
"c":66 }},
{
"type":"house",
"object":{
"d":66,
"e":66,
"f":66 }},
{
"type":"car",
"object":{
"a":66,
"b":66,
"c":66 }}
]}
正如你所看到的,对于“car”和“house”,有不同的“object”结构体,但都在标记“object”下。
最理想的情况是最后能得到
struct StuffItem: Decodable {
let type: TheType
let car: Car
let house: House
}
有没有一种可编程的,快速的方法来处理这个问题?
3条答案
按热度按时间h79rfbju1#
在我看来,最快捷的方式是使用关联类型的枚举
This是有效的JSON
这些是结构体
和解码JSON的代码
s4n0splo2#
你可以通过使用枚举来处理多种情况,只需定义你的类型,给出代码将帮助你通过使用带有枚举的Struct模态来解析JSON。
7kqas0il3#
另一个解释:
由于没有太多的解释,这里是@vadian解释的另一个例子:
1. Swift中 * 使用enum而不是struct* 来实现“灵活类型”。
2.然后你需要对'item'和'type'进行解析。
3.解析,然后切换到解码,设置正确的类型即可。
所以对于上面的JSON,你需要
每个项目可以是汽车或房子。
所以这些都很容易。
现在是
Item
。它可以是多个类型。在Swift中,* 使用enum* 而不是struct来实现“灵活类型”。
接下来,简单地将其镜像到一个原始枚举中,该枚举将用于解析“type”字段(您可以称之为任何名称,我只是将其称为“Parse”)。
接下来,查看最上面的原始JSON。每个“item”都有两个字段,“type”和“object”。这里它们在一个原始枚举中。(同样,您可以称之为任何东西,我在这里将其称为“Keys”。)
有一个enum来解析'item'级别,还有一个enum来解析'type'。
最后,编写“Item”的初始化器。只需解码顶层和“type”...
解码数据(使用相关的类),并将“Item”枚举对象设置为适当的类型。
解析这些,然后切换到解码/设置枚举。
以下是整件事的一个步骤: