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

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,将无法解析)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:02:07