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

