gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:17:22 25 4
gpt4 key购买 nike

我尝试使用 Swift 4.1 的新功能在 JSON 解码过程中将蛇形命名法转换为驼峰命名法。

这是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 。我错过了什么吗?

最佳答案

JSONDecoder(和 JSONEncoder)的关键策略适用于负载中的所有 key ,包括您为其提供自定义编码 key 的 key 。解码时,首先使用给定的 key 策略映射 JSON key ,然后解码器将引用要解码的给定类型的 CodingKeys

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

  1. Capitalize each word that follows an underscore.

  2. Remove all underscores that aren't at the very start or end of the string.

  3. Combine the words into a single string.

The following examples show the result of applying this strategy:

fee_fi_fo_fum

    Converts to: feeFiFoFum

feeFiFoFum

    Converts to: feeFiFoFum

base_uri

    Converts to: 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
}
}

关于ios - `convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057035/

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