Swift解析谷歌图书API时遇到预期解码数组却找到字典错误如何解决
问题原因与修复方案
核心错误点
- JSON中每个item下的
volumeInfo是单个字典对象,你在Items结构体中将其定义为[VolumeInfo]?数组类型,类型不匹配直接触发了「期望解析数组但找到字典」的报错。 - JSON里
volumeInfo下的authors是字符串数组类型,你在VolumeInfo结构体中将其定义为String?,即使修复第一个问题后也会触发新的解析错误。 - 额外优化点:
description字段建议改为可选类型,避免部分书籍无描述字段时解析崩溃。
修正后的数据模型代码
struct Book: Codable { var totalItems: Int = 0 var items: [Items]? } struct Items: Codable { var id: String? var etag: String? // 数组改为单个VolumeInfo可选类型,匹配JSON结构 var volumeInfo: VolumeInfo? } struct VolumeInfo: Codable { // 改为数组类型匹配JSON的authors结构 var authors: [String]? // 实际返回的categories也是数组,同步修正类型 var categories: [String]? // 改为可选类型避免无对应字段时解析崩溃 var description: String? var pageCount: Int? var publishedDate: String? var publisher: String? var subtitle: String? var title: String? }
可选优化点
解包bookInfo.items时不要用强制解包!,改用可选绑定避免空值崩溃:
do { let bookInfo = try decoder.decode(Book.self, from: data!) if let bookItems = bookInfo.items { self.items = bookItems print("Retrieved books are \(self.items)") } } catch { print("Error in json parsing\(error)") }
注:原代码中decorder为拼写错误,正确拼写为decoder。
内容的提问来源于stack exchange,提问作者Meri
相关产品推荐
相关产品推荐

