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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:04