【发布时间】:2020-07-21 18:41:39
【问题描述】:
大家好,我有一个关于 Swift 中的 Encodable 协议的小问题。
我有以下 json 文件:
let magicJson = """
{
"value": [
{
"scheduleId": "magic@yahoo.com",
"somethingEventMoreMagical": "000220000"
}
]
}
""".data(using: .utf8)!
对于解码,我尽量避免创建两个都与可解码对象一起使用的对象,第一个对象包含第二个对象的数组。我想将该对象展平为如下所示:
struct MagicalStruct: Decodable {
private enum CodingKeys: String, CodingKey {
case value
}
private enum ScheduleCodingKeys: String, CodingKey {
case roomEmail = "scheduleId"
}
let roomEmail: String
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let magicContainer = try container.nestedContainer(keyedBy: ScheduleCodingKeys.self, forKey: .value)
roomEmail = try magicContainer.decode(String.self, forKey: ScheduleCodingKeys.roomEmail)
}
}
但是,当我尝试以下代码时:JSONDecoder().decode(MagicalStruct.self, magicJson) 我知道它需要一个数组但得到一个字典。另一方面,当我使用JSONDecoder().decode([MagicalStruct].self, magicJson) 时,我得到它接收一个数组但需要一个字典。
有人知道为什么会这样吗?
【问题讨论】:
-
您的输入 JSON 中似乎没有
scheduleId键。 -
我编辑错了json,里面也是scheduleId,让我编辑:D