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

Swift中异步方法解码API返回JSON数据时抛出错误如何解决

问题定位

你碰到的keyNotFound解码错误提示找不到locationOfRestaurant字段,哪怕你已经把Venue结构体的属性名改回location仍然报错,本质是两个原因:要么代码里还残留了旧的字段映射逻辑,要么Xcode增量编译用了旧的缓存代码,根本没跑你最新改的版本。

修复步骤
  • 第一步:检查Venue.swift里的Codable映射
    打开Venue.swift文件,如果你自定义了CodingKeys枚举,一定要检查里面有没有残留的旧映射代码,比如类似case locationOfRestaurant = "location"这种你之前改属性名留下的代码,删掉或者改成正确的case location即可。如果没写自定义CodingKeys,确认结构体里的location属性没有拼错,和你打印的JSON返回里商家层级的字段名完全一致。
    正确的属性定义参考:
    struct Venue: Codable {
        // 其余业务属性...
        let location: BusinessLocation // 字段名和JSON键完全对齐
    }
    
  • 第二步:彻底清理Xcode构建缓存
    Xcode增量编译经常出现代码更新不生效的问题,按顺序操作:
    1. 按下快捷键Shift + Command + K执行Clean Build Folder
    2. 关闭Xcode,打开访达按Shift + Command + G,输入路径~/Library/Developer/Xcode/DerivedData,删除和你当前项目名对应的缓存文件夹
    3. 重新打开Xcode,等项目索引完成后重新编译运行
  • 第三步:加精准解码日志定位残留问题
    如果前两步操作完还是报错,把原来解码部分的do-catch替换成下面的代码,打印完整的解码上下文,能精确定位到出错的字段层级:
    do {
        let businessResults = try JSONDecoder().decode(BusinessSearchResult.self, from: data)
        // 解码成功后的业务逻辑
    } catch DecodingError.keyNotFound(let key, let context) {
        print("缺失键名:\(key.stringValue)")
        print("出错层级路径:\(context.codingPath.map { $0.stringValue })")
        print("错误详情:\(context.debugDescription)")
    } catch {
        print("其余解码错误:\(error)")
    }
    
    打印出来的层级路径会明确告诉你是哪个嵌套结构体里还在找locationOfRestaurant字段,直接去对应文件修改即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:36:26