调用TheMealDB API获取JSON数据时出现CodingKeys解码错误如何解决?
问题解决方案
错误根因
你定义的MealDetailResponse模型完全匹配API返回结构,问题出在解码环节指定了错误的解码类型:API返回的JSON根节点是包含meals数组的对象,而非直接返回Meal类型对象,直接解码Meal.self会在根节点查找strMeal字段,自然触发字段不存在的报错。
修复步骤
1. 修正解码逻辑
修改fetchJSON方法中的解码代码,同时将解析得到的数组赋值给控制器全局的meals属性,避免解析结果丢失:
func fetchJSON(completed: @escaping () -> ()) { let url = URL(string: "https://www.themealdb.com/api/json/v1/1/filter.php?c=Beef")! URLSession.shared.dataTask(with: url) { [weak self] data, response, error in guard let self = self, error == nil, let data = data else { print(error ?? "数据为空") return } do { // 解码外层的MealDetailResponse而非Meal let response = try JSONDecoder().decode(MealDetailResponse.self, from: data) DispatchQueue.main.async { // 将解析结果赋值给全局数组,后续用来刷新表格 self.meals = response.meals self.TableView.reloadData() // 记得刷新表格,否则数据不会展示 completed() } } catch { print(error) } }.resume() }
2. 其他说明
- 你当前已经定义的
MealDetailResponse、Meal模型不需要做任何修改 - 上述修改加入了可选绑定判断,避免对
data强制解包引发的崩溃问题 - 闭包添加
[weak self]可以避免循环引用导致的内存泄漏
内容的提问来源于stack exchange,提问作者Wen Love Howard
相关产品推荐
相关产品推荐

