Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何简化嵌套JSON的Swift可编码结构?_Json_Swift_Codable - Fatal编程技术网

如何简化嵌套JSON的Swift可编码结构?

如何简化嵌套JSON的Swift可编码结构?,json,swift,codable,Json,Swift,Codable,我有一个类似这样的json { "connectType": "CALL", "connectFrequency": "WEEKLY", "status": { "status": "On" } } 我正在尝试使用Swift中的Codable解析它。我可以这样想: struct Preference : Codable {

我有一个类似这样的json

{
  "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”}