首页 > 解决方案 > 返回相似结构的 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,就像我说的,响应之间的结构是相同的,只是内容不同。

标签: iosjsonswiftjsondecoder

解决方案


如果您仔细阅读该错误,您会发现它非常具有描述性。所以,不要隐藏错误,就像你对 所做的那样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)- dataindex的一个元素4,即data[4],它是第五个元素。

长话短说,至少有一个(但实际上是两个)Anime对象的attribute属性coverImage: null在“破碎”的响应中。要解决此问题,请将此属性设为可选:

class Attributes: Codable {
   // other properties
   let coverImage: CoverImage?
}

推荐阅读