Я пытаюсь использовать новую функцию Swift 4.1 для преобразования snake-case в camelCase во время декодирования JSON.
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"
(сравните stackoverflow.com/a/44396824/2976878) - декодер применяет ключевую стратегию до обращения к кодированию ключи, поэтому он преобразует"student_id"
в"studentId"
. - person Hamish   schedule 17.04.2018