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

Swift中解析RapidAPI新冠接口返回的嵌套数组失败如何解决?

问题原因及解决方案

第一步:先捕获具体解析错误定位问题

你当前用try?进行解析会直接吞掉所有错误信息,没法知道具体失败原因,首先把解析代码替换为do-catch结构打印错误:

override func viewDidLoad() {
    super.viewDidLoad()

    Service.shared.getInfo(requestURL: "url", host: "host", key: "12345", needsKey: true) { data in
        guard let data = data else { return }
        do {
            let countryList = try JSONDecoder().decode([Country].self, from: data)
            guard let firstCountry = countryList.first,
                  let provinces = firstCountry.provinces,
                  !provinces.isEmpty else {
                print("无有效省份数据")
                return
            }
            self.provinceStr = provinces[0].province
        } catch {
            // 这里打印的错误会直接告诉你是字段缺失、类型不匹配还是其他问题
            print("解析失败错误信息:\(error)")
        }
        
        DispatchQueue.main.async {
            [unowned self] in
            print(self.provinceStr)
        }
    }
}

最常见的问题原因

你描述的「注释provinces字段就能正常解析国家名」,90%以上的概率是接口返回的部分国家数据中,provinces字段为null,而你定义的模型中provinces是不可选的数组类型,Codable解析时无法把null转为非可选类型,直接触发全局解析失败。
修改Country模型即可解决:

struct Country: Codable{
    let country: String
    // 将provinces改为可选数组类型,适配null的情况
    let provinces: [Province]?
    // 如果你需要用到返回的经纬度、日期字段可以补上,不补也不影响解析
    // let latitude: Double
    // let longitude: Double
    // let date: String
}

struct Province: Codable{
    let province: String
    let confirmed: Int
    let recovered: Int
    let deaths: Int
    let active: Int
}

其他可能的原因

如果改完可选还是解析失败,根据第一步打印的错误信息对应处理即可:

  • 如果提示数值类型不匹配:说明返回的某个数字字段(比如confirmed)实际是字符串格式,把模型中对应字段类型改为String即可
  • 如果提示字段不存在:检查接口返回的字段名和模型字段名拼写是否完全一致,区分大小写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:04