How*_*ard 11 ios swift codable jsondecoder
我尝试使用Swift 4.1的新功能在JSON解码期间将snake-case转换为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)
}
Run Code Online (Sandbox Code Playgroud)
我需要提供自定义,CodingKeys因为convertFromSnakeCase策略无法推断首字母缩略词或首字母缩写词(例如studentID)的大写字母,但我希望convertFromSnakeCase策略仍然适用testScore.但是,解码器抛出错误("没有与键CodingKeys相关的值"),似乎我不能同时使用convertFromSnakeCase策略和自定义CodingKeys.我错过了什么吗?
Ham*_*ish 15
JSONDecoder(和JSONEncoder)的关键策略适用于有效负载中的所有密钥 - 包括为您提供自定义编码密钥的密钥.解码时,首先使用给定的密钥策略映射JSON密钥,然后解码器将查询CodingKeys正在解码的给定类型.
在你的情况下,student_id在你的JSON密钥将被映射到studentId的.convertFromSnakeCase.文档中给出了转换的确切算法:
将下划线后面的每个单词大写.
删除不在字符串的开头或结尾的所有下划线.
将单词组合成一个单独的字符串.
以下示例显示了应用此策略的结果:
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
}
}
Run Code Online (Sandbox Code Playgroud)