Swift解码JSON出现JSONNull类型不匹配错误的解决咨询
解决Swift Codable解码typeMismatch错误(models[1].matrix[1].union字段)
typeMismatch错误的核心原因是JSON中该字段的实际类型与你Codable模型定义的类型不匹配,针对union字段可按以下步骤排查修复:
1. 定位JSON中union字段的真实类型
先打印获取到的原始JSON数据,精准定位到models[1].matrix[1].union对应的内容,确认它的实际类型:
- 比如模型定义为
String,但JSON里是数字(如123); - 模型定义为
Int,但JSON里是字符串(如"123"); - 字段存在
null值,但模型未设为可选类型; - 极端场景:JSON中该字段是数组,模型却定义为单个值,或反之。
2. 修正模型中union字段的定义
根据JSON真实类型调整模型:
- 若字段可能为
null,直接改为可选类型:struct Matrix: Codable { var union: String? // 或对应类型的可选形式 } - 若JSON类型与模型需求类型不匹配,添加自定义解码逻辑:
比如JSON是数字但模型需要字符串:struct Matrix: Codable { var union: String? enum CodingKeys: String, CodingKey { case union } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // 优先尝试解码数字转字符串,失败则直接解码字符串 if let intVal = try? container.decode(Int.self, forKey: .union) { union = String(intVal) } else { union = try? container.decode(String.self, forKey: .union) } } } - 若字段时而为单个值时而为数组,统一处理为数组:
struct Matrix: Codable { var union: [String]? init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) if let singleVal = try? container.decode(String.self, forKey: .union) { union = [singleVal] } else { union = try? container.decode([String].self, forKey: .union) } } }
3. 检查JSONNull辅助类的兼容性
如果你用JSONNull处理空值,确认它是否适配union字段的类型场景:
- 若
union可能为null,将字段定义为var union: JSONNull?; - 若
JSONNull的解码逻辑无法兼容当前字段的混合类型,需调整其实现,确保能正确解析null与其他类型的切换。
4. 用工具辅助验证
可以借助SwiftyJSON快速解析并查看字段类型:
import SwiftyJSON let jsonData = // 你的原始网络数据 let json = JSON(jsonData) let unionType = json["models"][1]["matrix"][1]["union"].type print(unionType) // 输出该字段的真实类型:string、number、null、array等
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

