假设我有下面的struct和json数据。我们可以写一个init(decode:Decoder)函数来转换具有此条件的对象吗?如果OptionContainer的randomKey存在,使用randomKey值来查找选项的id。如果randomKey不存在,则只需使用id。
例如,下面两个选项的id都是["1","2","3"]
My Struct
struct OptionContainer: Decodable {
let randomKey: String?
let id: String
let text: String
struct Option: Decodable {
let id: String
let text: String
}
}
Json Data
[
{
"id": "123",
"text": "text",
"randomKey": "level",
"options": [
{
"text": "Hello",
"level": "1"
},
{
"text": "Hello2",
"level": "2"
},
{
"text": "Hello3",
"level": "3"
},
]
},
{
"id": "222",
"text": "text2",
"options": [
{
"text": "Hello",
"id": "1"
},
{
"text": "Hello2",
"id": "2"
},
{
"text": "Hello3",
"id": "3"
},
]
},
]
字符串
2条答案
按热度按时间4nkexdtk1#
一个可能的解决方案是将
options
解码为[String:String]
字典,获取随机密钥(如果不存在,则将其设置为id
)并手动创建Option
示例。字符串
j2cgzkjk2#
因为你想要一个通用的字符串键,你需要一个特殊的CodingKey:
字符串
这只是一个样板文件。我经常使用它,我有一个片段。它只是一个CodingKey,可以是任何String或Int。
接下来,你需要一个特殊的Option初始化。它实际上不是Decodable的。它只是有一个初始化,需要一个Decoder:
型
这允许您传递要用于
id
的密钥。有了这个,你可以编写OptionContainer Decodable init:
型
所有代码在一起:
型