gpt4 book ai didi

ios - Swift JSONDecoder - 编码键不适用于下划线

转载 作者:行者123 更新时间:2023-11-28 13:42:53 25 4
gpt4 key购买 nike

谁能解释一下为什么 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

第二个函数将只显示没有下划线的编码键。但是,一旦我删除下划线,它就会在 allKeys 中具有编码键...

swift 4.2 - Xcode 10.2。

有什么想法吗?

最佳答案

.convertFromSnakeCasesnake_cased 变量转换为 camelCase 访问 CodingKeys 之前。

如果您想指定 CodingKeys,您必须在您的NOT WORKING 示例中使用转换后的值

enum CodingKeys: String, CodingKey {
case avar1 = "avar1"
case avar2 = "avar2"
}

但这说明了 CodingKeys 毫无意义。因此,反过来想并利用 key 解码策略。

与其删除 .convertFromSnakeCase,不如删除 CodingKeys 和初始化程序。

并始终捕获可能的解码错误。

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) }

关于ios - Swift JSONDecoder - 编码键不适用于下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com