微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何简化嵌套 JSON 的 Swift Codable Struct?

如何解决如何简化嵌套 JSON 的 Swift Codable Struct?

我有一个这样的 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 一样。理想情况下,我想要的是删除嵌套,因为它在 PreferenceStatus 中只有一个值。

有没有办法使用相同的 json 定义我的模型,如下所示:

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)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。