Swift解析JSON时出现typeMismatch类型不匹配错误如何解决
错误定位
错误日志的codingPath已经明确指向了问题字段路径:数组第0个元素 → answer节点 → quiz节点 → category字段,核心原因是字段类型定义不匹配:
- 服务端返回的JSON中,
quiz下的category是字符串类型的ID值:"category":"61235bc5d0dd5339b7ff563b" - 但你在
Quiz模型中把category声明为了自定义的Category类类型,JSONDecoder尝试把字符串解析为字典结构的Category对象时,就会抛出「期望字典但找到字符串」的typeMismatch错误。
解决方法
根据业务需求二选一即可:
方案1:仅需要存储分类ID
如果业务不需要分类的完整属性,只需要ID值,直接修改Quiz模型的category类型为String:
class Quiz: Codable { // 把原来的let category: Category修改为 let category: String // 默认init里对应修改赋值 init() { // 删掉原来的self.category = Category() self.category = "" // 其他属性保持不变 } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // 把原来的Category解析逻辑修改为 self.category = try container.decodeIfPresent(String.self, forKey: .category) ?? "" // 其他属性解析保持不变 } }
方案2:需要完整分类信息
如果业务需要获取分类的完整属性,联系服务端修改返回结构,把category字段从字符串ID改为和你预设Category模型结构匹配的字典对象即可。
额外优化建议
你当前所有模型都重写了完整的解码逻辑,如果你只是需要解析失败时给默认值,不需要全量自定义解码方法:
- 可以直接把属性声明为可选类型,解码失败会自动置为nil,减少冗余代码
- 如果必须保留非可选类型加默认值的逻辑,可以封装
Codable扩展简化默认值赋值代码,避免每个模型都写重复的decodeIfPresent逻辑。
内容的提问来源于stack exchange,提问作者Ahsan Aasim
相关产品推荐
相关产品推荐

