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

Swift添加CodingKeys后JSON解码失败问题求助

Swift 添加自定义CodingKeys后JSON解码失效排查

核心问题点及解决办法


1. 自定义CodingKeys覆盖自动映射,需完全匹配所有字段

添加自定义CodingKeys枚举后,Swift会放弃自动生成的Codable映射逻辑,所有需要解码的结构体属性必须在CodingKeys中声明,哪怕是可选类型。

比如原自动解码的结构体:

struct MainWeather: Codable {
    var temp: Double
    var tempMin: Double
    var humidity: Int?
}

若添加CodingKeys时遗漏humidity,哪怕它是可选属性,解码也会直接失败。

2. CodingKeys的rawValue必须与JSON字段严格一致

JSON中以下划线命名的字段(如temp_min),必须在CodingKeys中手动指定rawValue,不能依赖Swift的自动蛇形转换策略(哪怕之前设置过JSONDecoder.keyDecodingStrategy = .convertFromSnakeCase)——自定义CodingKeys会覆盖该策略。

错误示例:

enum CodingKeys: String, CodingKey {
    case temp
    case tempMin // 默认rawValue为"tempMin",与JSON的"temp_min"不匹配
}

正确示例:

enum CodingKeys: String, CodingKey {
    case temp
    case tempMin = "temp_min"
    case humidity
}

3. 打印解码错误信息定位具体问题

在解码逻辑中捕获并打印错误,能直接看到哪个字段匹配失败,是最高效的排查方式:

do {
    let decoder = JSONDecoder()
    let mainWeather = try decoder.decode(MainWeather.self, from: jsonData)
} catch {
    print("解码失败:\(error)") // 错误信息会明确提示缺失的字段或不匹配的key
}

补充验证示例

假设你的JSON数据如下:

{
  "temp": 23.1,
  "temp_min": 19.5,
  "temp_max": 26.3,
  "humidity": 58
}

对应的正确结构体+CodingKeys写法:

struct MainWeather: Codable {
    var temp: Double
    var tempMin: Double
    var tempMax: Double
    var humidity: Int
    
    enum CodingKeys: String, CodingKey {
        case temp
        case tempMin = "temp_min"
        case tempMax = "temp_max"
        case humidity
    }
}

内容的提问来源于stack exchange,提问作者eatom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:28:12