You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 06:24:05