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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:31:15