Swift JSON解析异常:字段映射错误与gst_data未解析问题
Swift Codable JSON解析异常排查与修复方案
1. 检查字段名与CodingKeys映射
- 确保模型类中
count、final_price_amount、gst_data的键映射完全匹配JSON响应:- 若JSON使用下划线命名、Swift用驼峰命名,可通过
CodingKeys手动映射,或开启自动驼峰转换:// 手动映射示例 struct CartItem: Codable { let count: Int let finalPriceAmount: Double let gstData: CartGSTData? enum CodingKeys: String, CodingKey { case count case finalPriceAmount = "final_price_amount" case gstData = "gst_data" } } // 全局自动转换 let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase - 注意:手动定义
CodingKeys时,必须包含所有需要解析的字段,未声明的字段会被自动忽略(比如gst_data若未加入CodingKeys,将无法解析)。
- 若JSON使用下划线命名、Swift用驼峰命名,可通过
2. 排查数据类型不匹配问题
count被final_price_amount的值错误填充,核心原因大概率是字段类型不匹配或映射错误:
- 确认JSON中
count的类型(如Int)与Swift模型中的类型完全一致,避免将Int类型字段声明为Double,反之亦然。 - 检查
CodingKeys是否存在映射错误,比如误将count映射到final_price_amount的键上。
3. 验证嵌套模型CartGSTData的实现
gst_data未被解析,需从两方面确认:
- 在
CartItem模型中,将gstData声明为可选类型(CartGSTData?),避免JSON中该字段缺失或为null时导致整个解析失败。 - 确保
CartGSTData自身的Codable实现正确,内部字段的类型、键映射均与JSON响应匹配:struct CartGSTData: Codable { let gstRate: Double let gstAmount: Double enum CodingKeys: String, CodingKey { case gstRate = "gst_rate" case gstAmount = "gst_amount" } }
4. 调试技巧定位问题
- 先将响应数据转为String打印,确认与Postman返回的JSON完全一致,排除数据传输过程中的篡改。
- 用
JSONSerialization先解析为字典,手动提取字段值对比,快速定位是模型问题还是数据问题:if let jsonDict = try? JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] { print("count: \(jsonDict["count"] ?? "nil")") print("final_price_amount: \(jsonDict["final_price_amount"] ?? "nil")") print("gst_data: \(jsonDict["gst_data"] ?? "nil")") }
内容的提问来源于stack exchange,提问作者Rahul Gupta
相关产品推荐
相关产品推荐

