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
相关产品推荐
相关产品推荐

