请有人解释一下为什么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中有编码键.
SWIFT4.2- Xcode 10.2。
有什么想法吗?
发布于 2019-04-26 15:25:11
.convertFromSnakeCase在snake_cased访问CodingKeys之前将变量转换为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) }https://stackoverflow.com/questions/55816336
复制相似问题