如何简化嵌套JSON的Swift可编码结构?
我有一个类似这样的json如何简化嵌套JSON的Swift可编码结构?,json,swift,codable,Json,Swift,Codable,我有一个类似这样的json { "connectType": "CALL", "connectFrequency": "WEEKLY", "status": { "status": "On" } } 我正在尝试使用Swift中的Codable解析它。我可以这样想: struct Preference : Codable {
{
"connectType": "CALL",
"connectFrequency": "WEEKLY",
"status": {
"status": "On"
}
}
我正在尝试使用Swift
中的Codable
解析它。我可以这样想:
struct Preference : Codable {
let connectFrequency : String?
let connectType : String?
let status : PreferenceStatus?
}
struct PreferenceStatus : Codable {
let status : String?
}
现在,当我必须检查status
on/off值时,我必须像obj.status?.status那样进行检查。理想情况下,我希望删除嵌套,因为它在PreferenceStatus
中只有一个值
有没有一种方法可以使用相同的json定义我的模型,如下所示:
struct Preference : Codable {
let connectFrequency : String?
let connectType : String?
let status : String?
}
我不熟悉Codable
范式。请帮忙。谢谢。要使结构扁平化,必须手动解码JSON<代码>状态
可以解码为枚举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)
}
首先,如果您知道json总是包含这些键,请避免使用optionals。为了以您想要的方式简化结构,您需要实现自定义解码自定义解码或向结构添加计算属性,例如
var-isOn:Bool{status?.status==“On”}