[英]How to simplify Swift Codable Struct for nested JSON?
我有一個像這樣的 json。
{
"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
一樣 go 。 我理想情況下想要的是刪除嵌套,因為它在PreferenceStatus
中只有一個值。
有沒有辦法使用相同的 json 來定義我的 model,如下所示:
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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.