JSONDecoder 找不到存在的密钥

Posted

技术标签:

【中文标题】JSONDecoder 找不到存在的密钥【英文标题】:JSONDecoder fails to find key that is present 【发布时间】:2019-10-03 16:45:44 【问题描述】:

当尝试解析来自 Github 的 REST api 中 Create Team 调用的响应时,JSONDecoder 在解析存储库的许多蛇形封装键时失败。通过JSONSerialization解码时,可以毫无问题地找到所有的key。

例如,在 Xcode 11.0 (11A420a) 的 Playground 中运行时,使用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

【问题讨论】:

您的变量名与 JSON 键不匹配,您可以查看此答案以获取一些替代方案***.com/a/44396824/725628 试试sshUrl 而不是sshURL 【参考方案1】:

尝试将sshURL 更改为sshUrlkeyDecodingStartegy 会将 sshURL 转换为 ssh_URL,这与您的密钥不匹配。 sshUrl 将转换为 ssh_url,这将匹配您的密钥。

【讨论】:

以上是关于JSONDecoder 找不到存在的密钥的主要内容,如果未能解决你的问题,请参考以下文章

JSONDecoder和JSONEncoder类是线程安全的吗?

检查 Firebase 中是不是存在密钥

找不到密钥 akka 的配置设置

在密钥库 C:\Users\alan\newapp\android\app\key.jks 中找不到别名为“上传”的密钥

我找不到 Android 密钥工具

检查 Berkeley DB C++ API 中是不是存在密钥 [关闭]