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增量编译经常出现代码更新不生效的问题,按顺序操作:- 按下快捷键
Shift + Command + K执行Clean Build Folder - 关闭Xcode,打开访达按
Shift + Command + G,输入路径~/Library/Developer/Xcode/DerivedData,删除和你当前项目名对应的缓存文件夹 - 重新打开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
相关产品推荐
相关产品推荐

