`convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`

Posted

技术标签:

【中文标题】`convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`【英文标题】:The `convertFromSnakeCase` strategy doesn't work with custom `CodingKeys` in Swift 【发布时间】:2018-09-27 15:04:35 【问题描述】:

我尝试在 JSON 解码过程中使用 Swift 4.1 的新功能将蛇形大小写转换为骆驼大小写。

这里是example:

struct StudentInfo: Decodable 
    internal let studentID: String
    internal let name: String
    internal let testScore: String

    private enum CodingKeys: String, CodingKey 
        case studentID = "student_id"
        case name
        case testScore
    


let jsonString = """
"student_id":"123","name":"Apple Bay Street","test_score":"94608"
"""

do 
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let decoded = try decoder.decode(StudentInfo.self, from: Data(jsonString.utf8))
    print(decoded)
 catch 
    print(error)

我需要提供自定义 CodingKeys,因为 convertFromSnakeCase 策略无法推断首字母缩写词或首字母缩写词(例如 studentID)的大写,但我希望 convertFromSnakeCase 策略仍然适用于 testScore。但是,解码器抛出错误(“没有与键 CodingKeys 关联的值”),似乎我不能同时使用convertFromSnakeCase 策略和自定义CodingKeys。我错过了什么吗?

【问题讨论】:

你想要case studentID = "studentId"(比较***.com/a/44396824/2976878)——解码器在查询编码密钥之前应用密钥策略,因此它将"student_id"转换为"studentId" 谢谢@Hamish!这行得通! @Rob 我有时间会做(如果没有其他人同时发布答案,那就是) 【参考方案1】:

JSONDecoder(和JSONEncoder)的密钥策略适用于有效负载中的所有密钥,包括您为其提供自定义编码密钥的密钥。解码时,首先使用给定的密钥策略映射 JSON 密钥,然后解码器将查询CodingKeys 以获取正在解码的给定类型。

在您的情况下,您的 JSON 中的 student_id 键将通过 .convertFromSnakeCase 映射到 studentId。转换的确切算法是given in the documentation:

    将下划线后的每个单词大写。

    删除所有不在字符串开头或结尾的下划线。

    将单词组合成一个字符串。

以下示例显示了应用此策略的结果:

fee_fi_fo_fum

    转换为:feeFiFoFum

feeFiFoFum

    转换为:feeFiFoFum

base_uri

    转换为:baseUri

因此,您需要更新您的 CodingKeys 以匹配此:

internal struct StudentInfo: Decodable, Equatable 
  internal let studentID: String
  internal let name: String
  internal let testScore: String

  private enum CodingKeys: String, CodingKey 
    case studentID = "studentId"
    case name
    case testScore
  

【讨论】:

哇!非常感谢您指出转换的顺序! 非常有用的答案,尽管结果是我不会使用keyDecodingStrategy,因为它使代码的可读性大大降低。

以上是关于`convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`的主要内容,如果未能解决你的问题,请参考以下文章

”销售策略“怎么用英语说

alpha策略和beta策略的区别

域控制器组策略密码策略被锁定,如何解决?

思科策略路由 PBR 详解

Redis(过期策略)

Linux 内核调度器 ⑨ ( Linux 内核调度策略 | SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_NORMAL 策略 | SCHED_BATCH策略 )