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】:答案是No
。Codable
仅解码在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 添加更多属性,则包括枚举编码键的主要内容,如果未能解决你的问题,请参考以下文章
如何从 iOS Swift Codable 中的 API 响应通知或打印模型类上缺少的密钥?
如何使用 Codable 在 Swift 中使用动态文件名解析 JSON