JSONDecoder не может найти ключ, который присутствует - PullRequest
0 голосов
/ 03 октября 2019

При попытке проанализировать ответ от вызова Create Team в REST API Github, JSONDecoder не удается выполнить синтаксический анализ многих ключей в оболочке змеи для хранилища. При декодировании через JSONSerialization он может без проблем найти все ключи.

Например, при запуске в Playground в Xcode 11.0 (11A420a) декодирование завершается неудачно при декодировании с JSONDecoder.

import Foundation

let jsonData = """
{
"id": 12345,
"name": "swift",
"ssh_url": "git@github.com:apple/swift.git"
}
""".data(using: .utf8)!

struct ExampleModel: Codable {
    let id: Int
    let name: String
    let sshURL: String
}

let jsonObject = try! JSONSerialization.jsonObject(with: jsonData, options: []) as! [String: Any]
print("JSONSerialization:", jsonObject["id"]!, jsonObject["name"]!, jsonObject["ssh_url"]!)

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let decodedObject = try! decoder.decode(ExampleModel.self, from: jsonData) // Fails here
print("JSONDecoder:", decodedObject.id, decodedObject.name, decodedObject.sshURL)

// Output:
//
// JSONSerialization: 12345 swift git@github.com:apple/swift.git
// Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "sshURL", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"sshURL\", intValue: nil) (\"sshURL\"), converted to ssh_url.", underlyingError: nil)): file MyPlayground.playground, line 22

Есть ли что-то другое, что я должен сделать, чтобы разобрать это значение?

Swift версия:

Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)
Target: x86_64-apple-darwin19.0.0

1 Ответ

3 голосов
/ 03 октября 2019

Попробуйте изменить sshURL на sshUrl. keyDecodingStartegy преобразует sshURL в ssh_URL, что не соответствует вашему ключу. sshUrl будет преобразовано в ssh_url, что будет соответствовать вашему ключу.

...