如何解决如何简化嵌套 JSON 的 Swift Codable Struct?
{
"connectType": "CALL","connectFrequency": "WEEKLY","status": {
"status": "On"
}
}
我正在尝试使用 Codable
中的 Swift
解析它。我可以这样想:
struct Preference : Codable {
let connectFrequency : String?
let connectType : String?
let status : PreferenceStatus?
}
struct PreferenceStatus : Codable {
let status : String?
}
现在,当我必须检查 status
开/关值时,我将不得不像 obj.status?.status
一样。理想情况下,我想要的是删除嵌套,因为它在 PreferenceStatus
中只有一个值。
有没有办法使用相同的 json 定义我的模型,如下所示:
struct Preference : Codable {
let connectFrequency : String?
let connectType : String?
let status : String?
}
我是 Codable
范式的新手。请协助。谢谢。
解决方法
要扁平化结构,您必须手动解码 JSON。 status
可以解码为枚举。 connectFrequency
和 connectType
似乎也是枚举。
let jsonString = """
{
"connectType": "CALL","connectFrequency": "WEEKLY","status": {
"status": "On"
}
}
"""
enum Frequency : String,Decodable {
case hourly = "HOURLY",weekly = "WEEKLY"
}
enum Status : String,Decodable {
case off = "Off",on = "On"
}
struct Preference : Decodable {
let connectFrequency : Frequency
let connectType : String
let status : Status
private enum CodingKeys : String,CodingKey { case connectFrequency,connectType,status }
init(from decoder : Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
connectFrequency = try container.decode(Frequency.self,forKey: .connectFrequency)
connectType = try container.decode(String.self,forKey: .connectType)
let nestedContainer = try container.nestedContainer(keyedBy: CodingKeys.self,forKey: .status)
status = try nestedContainer.decode(Status.self,forKey: .status)
}
}
let data = Data(jsonString.utf8)
do {
let result = try JSONDecoder().decode(Preference.self,from: data)
print(result)
} catch {
print(error)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。