当前位置: 首页 > 面试题库 >

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

程卓君
2023-03-14
问题内容

我尝试使用Swift 4.1的新功能在JSON解码期间将蛇案转换为camelCase。

这是示例:

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。我想念什么吗?


问题答案:

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

在你的情况下,student_id在你的JSON密钥将被映射到studentId.convertFromSnakeCase。文档中给出了转换的确切算法:

  1. 下划线后的每个单词均大写。

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

  3. 将单词组合成一个字符串

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

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


 类似资料:
  • 我想通过一个自定义的泛型unapply函数压缩我的计算器,该函数计算参数并在成功时返回值。 但是这失败了,错误 有什么方法可以实现这一点吗?我已经研究了类型标签,不适用方法的隐式转换,但我不知道如何将它们集成到这个问题中。如何正确定义Eval?

  • 用于自定义设置隐藏虚拟机、镜像菜单功能以及配置第三方回调地址。 策略定义用于定义策略的具体内容,如设置隐藏虚拟机、系统镜像菜单功能以及配置第三方回调地址等。策略配置完成后,还需要将策略分配到具体项目、域或全局,策略分配成功后将出现在策略分配列表。即策略在具体的应用范围内才会生效。当策略在不同应用范围内有冲突时,最小应用范围的策略生效。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击

  • 我是Flink的新手,所以在定义Flink中的水印时,我面临一些问题。 让我们从Kafka消费者开始。使用的反序列化是JSONKeyValueDeserializationSchema,因此没有自定义解析。 如果将接收器应用于此代码,则其工作正常。问题是需要水印来避免无序事件。这就是我写的策略: 在做了一些研究后,我最终得到了这段代码,但这不起作用。这些是我的问题: 在这里使用ObjectNode

  • 问题内容: 语境 我们有一个批处理作业,可将本地化的国家名称(即国家名称翻译为不同语言)从外部复制到我们的数据库中。这个想法是在1个块中处理单个国家/地区的所有本地化的国家名称(即第一个块- 安道尔的所有翻译,下一个块- 阿联酋的所有翻译,等等)。我们使用读取外部数据和一些oracle分析功能来提供该国家/地区可用的翻译总数: 问题 因此,按块分割此输入看起来很简单:在读取了其中指定的确切行数后停

  • 我有一些自定义角色,例如: 当使用'ROLE_USER'时,“spans”中的文本可以正常显示,但当使用其他角色时,文本无法显示。然后我在自定义角色中添加'ROLE_'前缀,它又变得正常了。 我尝试删除“ROLE\uu0”前缀约束,如下所示: 它也不起作用。知道如何删除强制的“ROLE\uuux”前缀吗?

  • 我使用spring boot和spring boot starter hateoas开发了一个rest服务。我在定制ObjectMapper时遇到了一个问题。代码如下: 一个pplication.java 依赖关系: 账单java: BillController.java: 我得到的输出是: 但是我需要“账单”代替“billList”。这是因为ObjectMapper没有被定制。我是否错过了任何配