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

Posted

技术标签:

【中文标题】Swift Codable:如果 API 将来可能向响应 JSON 添加更多属性,则包括枚举编码键【英文标题】:Swift Codable: Include enum Coding Keys if API may add more properties to response JSON in the future 【发布时间】:2019-09-20 20:25:35 【问题描述】:

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

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

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

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

【问题讨论】:

这个问题没有意义,如果一个json键不是你的结构的一部分,它就不会被解码。 如果它有额外的不匹配的键,我相信它会崩溃。 @user1107173 这是不正确的。他们只会被忽略。如果您因为意外的 JSON 键而遇到崩溃,请发布您的示例 JSON 和结构,我们可以帮助您解决问题。 【参考方案1】:

下面是一个运行良好的例子,证明结构体中未定义的额外 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)

【讨论】:

【参考方案2】:

答案是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")


【讨论】:

以上是关于Swift Codable:如果 API 将来可能向响应 JSON 添加更多属性,则包括枚举编码键的主要内容,如果未能解决你的问题,请参考以下文章

Swift 使用Codable协议进行json转模型

如何从 iOS Swift Codable 中的 API 响应通知或打印模型类上缺少的密钥?

如何使用 Codable 在 Swift 中使用动态文件名解析 JSON

Swift Codable 多种类型

在 swift 中使用“默认值”创建非可选 Codable 的最佳方法

使用 Codable 使用 Swift 归档