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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:18:00