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 个不同的模型时,这只是需要回填的大量额外代码。
不确定是否有更好的方法来处理这个问题?
答案是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")
}
下面是一个运行良好的例子,证明结构中未定义的额外 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)
}
我正在使用 Codable
解析我的 JSON
响应对象。
包含 enum CodingKeys: String, CodingKey
是否是一个好主意,这样将来如果 JSON
响应对象添加了额外的属性,它们将被忽略并且不会导致崩溃?
当您的应用程序中有 30 个不同的模型时,这只是需要回填的大量额外代码。
不确定是否有更好的方法来处理这个问题?
答案是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")
}
下面是一个运行良好的例子,证明结构中未定义的额外 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)
}