Swift解析Marvel API时Decodable报错:期望数组却得到字典
解决Marvel API解码错误与缩略图获取技巧
解码错误修复
你的错误根源是Marvel API的返回结构并非直接是角色数组,而是嵌套多层的字典结构:根节点是字典,其中data字段包含角色列表所在的results数组。直接解码[ReturnedData].self会导致类型不匹配,因为实际根节点是字典而非数组。
正确的Decodable结构体定义
根据API返回结构,需要定义多层结构体来匹配层级:
// 匹配API根响应 struct MarvelAPIResponse: Decodable { let data: MarvelData } // 匹配data字段的结构 struct MarvelData: Decodable { let results: [Character] } // 角色结构体,可根据需求扩展字段 struct Character: Decodable { let id: Int? let name: String? let description: String? let thumbnail: Thumbnail? // 关联缩略图结构体 } // 匹配thumbnail字段的结构 struct Thumbnail: Decodable { let path: String? let `extension`: String? // extension是Swift关键字,需加反引号转义 }
修改解码逻辑
更新网络请求中的解码代码,匹配新的结构体层级:
var savedData: [Character] = [] let urlString = "https://gateway.marvel.com/v1/public/characters?ts=1&apikey=\(myAPIKey)" guard let url = URL(string: urlString) else { return } let session = URLSession.shared let dataTask = session.dataTask(with: url) { (data, response, error) in guard let data = data else { return } do { let receivedData = try JSONDecoder().decode(MarvelAPIResponse.self, from: data) self.savedData = receivedData.data.results } catch { print("解码错误:\(error)") } } dataTask.resume()
缩略图获取技巧
Marvel API返回的thumbnail包含path(图片路径)和extension(图片格式)两个字段,需拼接成完整URL使用:
- 基础拼接方式:将path和extension用
.连接,示例:if let thumbnail = character.thumbnail, let path = thumbnail.path, let ext = thumbnail.`extension` { let thumbnailURL = URL(string: "\(path).\(ext)") // 使用thumbnailURL加载图片 } - 指定图片尺寸:Marvel支持在path后添加尺寸后缀,获取不同规格的图片,常用尺寸包括:
standard_small(65x45px)standard_medium(100x100px)portrait_xlarge(150x225px)landscape_incredible(464x261px)
示例拼接:
let thumbnailURL = URL(string: "\(path)/portrait_xlarge.\(ext)") - 处理缺失图片:部分角色可能没有缩略图,需提前判断
thumbnail、path、extension是否为nil,避免空指针错误。
内容的提问来源于stack exchange,提问作者Mason Ballowe
相关产品推荐
相关产品推荐

