有人能解释一下为什么A部分的代码是有效的,而B部分的代码不是。这让我很困惑。
工作
struct Coded : Codable, Hashable {
public let avar1: String
public let avar2: String
enum CodingKeys: String, CodingKey {
case avar1 = "avar1"
case avar2 = "avar2"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
print (container.allKeys)
avar1 = try container.decode(String.self, forKey: .avar1)
avar2 = try container.decode(String.self, forKey: .avar2)
}
}
let JSONStr = """
{
"avar1": "This is a string",
"avar2": "This is a string2",
}
"""
if let jsdata = JSONStr.data(using: .utf8) {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let aobj: Coded? = try? decoder.decode(Coded.self, from: jsdata)
print (aobj ?? "No object")
}
输出
[CodingKeys(stringValue: "avar1", intValue: nil), CodingKeys(stringValue: "avar2", intValue: nil)]
Coded(avar1: "This is a string", avar2: "This is a string2")
不工作
struct Coded : Codable, Hashable {
public let avar1: String
public let avar2: String
enum CodingKeys: String, CodingKey {
case avar1 = "avar1"
case avar2 = "avar_2"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
print (container.allKeys)
avar1 = try container.decode(String.self, forKey: .avar1)
avar2 = try container.decode(String.self, forKey: .avar2)
}
}
let JSONStr = """
{
"avar1": "This is a string",
"avar_2": "This is a string2",
}
"""
if let jsdata = JSONStr.data(using: .utf8) {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let aobj: Coded? = try? decoder.decode(Coded.self, from: jsdata)
print (aobj ?? "No object")
}
输出
[CodingKeys(stringValue: "avar1", intValue: nil)]
No object
第二个函数只显示不带下划线的编码键。但只要我去掉下划线,它就在所有键中都有编码键。。。
斯威夫特4.2-Xcode 10.2。
有什么想法吗?
最佳答案
.convertFromSnakeCase
在访问CodingKeys
之前,将snake\u case变量转换为camelCase。
如果要指定CodingKeys
,则必须在不工作的示例中使用转换后的值
enum CodingKeys: String, CodingKey {
case avar1 = "avar1"
case avar2 = "avar2"
}
但这说明了
CodingKeys
的无意义。所以换个角度考虑,利用密钥解码策略。而不是删除
.convertFromSnakeCase
删除CodingKeys
和初始值设定项。捕捉所有可能的
Decoding
错误。struct Coded : Codable {
public let avar1: String
public let avar2: String
}
let jsonStr = """
{
"avar1": "This is a string",
"avar_2": "This is a string2",
}
"""
let jsdata = Data(jsonStr.utf8)
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let aobj = try decoder.decode(Coded.self, from: jsdata)
print(aobj)
} catch { print(error) }