簡體   English   中英

如何簡化嵌套 JSON 的 Swift 可編碼結構?

[英]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可以解碼為枚舉。 connectFrequencyconnectType似乎也是枚舉。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM