ios - 返回相似结构的 2 个链接的 JSON 解码错误
问题描述
我有以下可用的代码,用于解码来自Kitsu API的 JSON 响应(说真的,只需在操场环境中复制和粘贴,你应该很高兴)。
我遇到了一些解码错误,导致try
语句中的代码失败,我不知道为什么。
我有两个链接返回相同的 JSON 正文(不同的结果但相同的结构),除了一个失败而一个没有。
// "https://kitsu.io/api/edge/anime?sort=popularityRank" <-- works
// "https://kitsu.io/api/edge/anime?sort=-startDate" <-- does not work
为了帮助调试失败的那个,我打印出data
以下语句:
print(String(data: data!, encoding: String.Encoding.utf8) as Any) // "as Any" to suppress warnings
有了这个,我可以看到数据对象包含我需要的一切,所以我排除了错误的响应(文本太大而无法复制,所以这是一个屏幕截图,你会得到图片):
如果我不得不猜测,问题出在解析中,但我解析它的方式适用于第一个链接。我到底能做些什么来调试这个?我已经并排比较了 json,就像我说的,响应之间的结构是相同的,只是内容不同。
解决方案
如果您仔细阅读该错误,您会发现它非常具有描述性。所以,不要隐藏错误,就像你对 所做的那样print("error, wtf")
,而是记录/打印它:
do {
let animeData = try JSONDecoder().decode(AnimeData.self, from: data!)
} catch {
print(error)
}
错误是:
valueNotFound(Swift.KeyedDecodingContainer<__lldb_expr_163.CoverImage.CodingKeys>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 4", intValue: 4), CodingKeys(stringValue: "attributes", intValue: nil), CodingKeys(stringValue: "coverImage", intValue: nil)], debugDescription: "Cannot get keyed decoding container -- found null value instead.", underlyingError: nil))
我发现向后阅读错误更容易,即自下而上。
马上,您会发现问题是“找到了 null 值”——即您的模型没有可选项来表示为 null 的值。
在哪里?CodingKeys(stringValue: "coverImage", intValue: nil)]
- 所以,coverImage
为空。
哪里是?CodingKeys(stringValue: "attributes", intValue: nil)
- 下attributes
,你可能知道。
但是哪一个,因为它是数组元素的属性?[CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 4", intValue: 4)
- data
index的一个元素4
,即data[4]
,它是第五个元素。
长话短说,至少有一个(但实际上是两个)Anime
对象的attribute
属性coverImage: null
在“破碎”的响应中。要解决此问题,请将此属性设为可选:
class Attributes: Codable {
// other properties
let coverImage: CoverImage?
}
推荐阅读
- git - 如何在 VSCode 中更改源远程?
- c# - 如何通过Selenium和C#保存通过SendKeys()方法发送的字符序列
- ruby-on-rails - 当我使用模态时,ruby on rails 设计编辑不起作用
- postgresql - SQL,拆分逗号分隔的字符串值,但保持正确的顺序?
- python - Renpy ELIF 语句
- azure - Azure Web 应用程序抛出错误 ETL 文件合并失败
- docker - 是否建议在 docker 容器内运行 systemd?
- python - TypeError:无法处理 PIL Image 中的数据类型
- r - R中数据帧聚合前的比较
- excel - VBA 中的自定义函数中的 #VALUE 错误