gpt4 book ai didi

json - 解析 JSON 数据时解码错误 - keyNotFound

转载 作者:行者123 更新时间:2023-11-30 10:34:18 26 4
gpt4 key购买 nike

我正在我的 iOS 应用程序中使用 NASA API 来获取一些图像。我的服务器响应如下所示:

{
"date": "2014-02-04T03:30:01",
"id": "LC8_L1T_TOA/LC81270592014035LGN00",
"resource": {
"dataset": "LC8_L1T_TOA",
"planet": "earth"
},
"service_version": "v1",
"url": "https://earthengine.googleapis.com/api/thumb?thumbid=bc77b079c8ecd07cd668c576c22b83a4&token=a16639b0d38dd68c586c24a6ee5299d9"
}

我的请求网址是:

https://api.nasa.gov/planetary/earth/imagery/?lon=100.75&lat=1.5&date=2014-02-01&api_key=DEMO_KEY

我用于解码此响应的结构是:

import Foundation

// MARK: - EarthImages
struct EarthImages: Codable {
let date: String
let id: String
let resource: Resource
let serviceVersion: String
let url: String

private enum CodingKeys: String, CodingKey {
case date = "date"
case id = "id"
case resource = "resource"
case serviceVersion = "service_version"
case url = "url"
}
}

问题是 - 当我尝试使用以下代码解码我的响应时

        URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
do {
let earthImages = try JSONDecoder().decode(EarthImages.self, from: data)
print(earthImages.url)
}
catch let error{
print(error)
}}

}.resume()

我进入控制台。

keyNotFound(CodingKeys(stringValue: "date", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"date\", intValue: nil) (\"date\").", underlyingError: nil))

我使用 PAW 检查是否得到正确的响应,并且它有效,因此问题更有可能出在我的代码中。我该如何解决这个问题?

最佳答案

它......看起来不错? (假设Resource也是Decodable,但这将是一个单独的问题)。也许该错误实际上告诉了您真相,您可能正在尝试解码没有日期值的 JSON blob。

在我们尝试解码之前,您可以通过添加的打印来明确查看我们尝试解码的内容:

if let data = data {
print(String(data: data, encoding: .utf8)!)
do {
...

另外,如果不能保证日期字段存在于每个响应中,则应将其设为可选:

struct EarthImages: Codable {
let date: String?
let id: String
let resource: Resource
let serviceVersion: String
let url: String
}
<小时/>

小提示,如果字符串枚举与枚举情况完全相同,则不需要重新声明:

enum CodingKeys: String, CodingKey {
case date // "date" is implied
case id
case resource
case serviceVersion = "service_version"
case url
}

另一个有趣的事实:如果每个键都一致,JSONDecoder 还可以自动从蛇形大小写转换,而无需定义 CodingKeys

所以你也可以这样做:

struct EarthImages: Codable {
let date: String
let id: String
let resource: Resource
let serviceVersion: String
let url: String
}

...

do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let earthImages = try decoder.decode(EarthImages.self, from: data)
}

关于json - 解析 JSON 数据时解码错误 - keyNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58420871/

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