Swift Codable:如果 API 将来可能会向响应 JSON 添加更多属性,则包括枚举编码键

Swift Codable: Include enum Coding Keys if API may add more properties to response JSON in the future

我正在使用 Codable 解析我的 JSON 响应对象。

包含 enum CodingKeys: String, CodingKey 是否是一个好主意,这样将来如果 JSON 响应对象添加了额外的属性,它们将被忽略并且不会导致崩溃?

当您的应用程序中有 30 个不同的模型时,这只是需要回填的大量额外代码。

不确定是否有更好的方法来处理这个问题?

答案是NoCodable 只解码在json 中找到的值。此外,如果您将 enum CodingKeys: String, CodingKey 添加到每个 Codable 协议,则没有必要。您可以将其保留为空值。

如果密钥不是 snakeCased,我们通常会写 enum CodingKeys: String, CodingKey。但是 Codable 有它自己的 keyDecodingStrategy


let jsonString = """
[
    {
        "profile_name": "Ankur Lahiry",
    },
    {
        "profile_name": "Karim Rahman",
    }
]
"""

let jsonData = Data(jsonString.utf8)


struct Name : Codable {
    var profileName: String?
}


let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase // will solve enum CodingKeys: String, CodingKey issue 
do {
    let names = try decoder.decode([Name].self, from: jsonData)
    print(names)
} catch {
    print("error")
}

下面是一个运行良好的例子,证明结构中未定义的额外 json 键将被忽略

let data = """
 { "id": 32, "name" : "abc", "other": "gbdfb"}
""".data(using: .utf8)!

struct JSONData: Decodable {
    let id: Int
    let name: String
}


do {
    let result = try JSONDecoder().decode(JSONData.self, from: data)
    print(result)
} catch {
    print(error)
}