Swift解析API返回JSON遇类型不匹配错误,求解决方法
问题排查与解决
核心错误原因
你的解析报错主要是日期解码策略不匹配:
- JSON中
meta字段下的last_updated_at是ISO 8601格式的字符串(如"2023-02-15T12:59:59Z"),但JSONDecoder默认无法自动将这种格式的字符串转换为Date类型,直接触发「类型不匹配」错误。 - 另外,JSON中的
value是高精度小数,用Float存储可能存在精度丢失,建议换成Double(这不是直接报错原因,但能避免后续潜在问题)。
修正后的代码
调整模型(可选但推荐)
把Currency中的value类型从Float改为Double:
import Foundation struct CurrencyAPIResponse_Latest: Codable { let meta: Meta let data: [String: Currency] } struct Currency: Codable { let code: String let value: Double // 替换Float为Double,提升精度 } struct Meta: Codable { let lastUpdatedAt: Date enum CodingKeys: String, CodingKey { case lastUpdatedAt = "last_updated_at" } }
配置JSONDecoder的日期解码策略
在解析JSON时,必须给JSONDecoder设置正确的日期解码策略:
// 假设你已经获取到JSON数据(data变量) do { let decoder = JSONDecoder() // 设置ISO 8601日期解码策略 decoder.dateDecodingStrategy = .iso8601 let response = try decoder.decode(CurrencyAPIResponse_Latest.self, from: data) // 解析成功,处理response print(response.meta.lastUpdatedAt) print(response.data) } catch { print("解析错误:\(error)") }
验证说明
- 设置
dateDecodingStrategy = .iso8601后,解码器能正确识别JSON中的ISO格式日期字符串,转换为Date类型。 - 改用
Double存储value,能更好适配JSON中的高精度小数,避免Float带来的精度损失问题。
内容的提问来源于stack exchange,提问作者Ernest Danials
相关产品推荐
相关产品推荐

