Swift 4正确Codable结构构建及KeyNotFound错误解决求助
解决Swift 4 Codable的KeyNotFound错误,构建正确的航班数据模型
嘿,刚上手Codable遇到KeyNotFound太正常了,我帮你一步步捋清楚!先拆解你拿到的JSON结构,再对应写出能完美解码的Swift模型。
第一步:先搞懂JSON的层级结构
你的JSON是航班对象的数组,每个航班里还嵌套了一个代码共享航班的数组。KeyNotFound错误基本逃不开这几个原因:
- 模型属性名和JSON的键名没对应上
- 某个字段在JSON里可能缺失/为空,但你在模型里定义成了非可选类型
- 嵌套的子结构没处理到位
第二步:写出正确的Codable模型
根据你给出的JSON片段,我帮你写好适配的模型,重点把可能为空/缺失的字段都设为可选类型:
// 代码共享航班的子模型 struct CodeShare: Codable { let fltId: String? let carrier: String? // 因为JSON键是大驼峰(比如"FltId"),Swift用小驼峰命名,所以用CodingKeys做映射 enum CodingKeys: String, CodingKey { case fltId = "FltId" case carrier = "Carrier" } } // 主航班模型 struct Flight: Codable { let fltId: String let carrier: String let orig: String let dest: String let cutOffTime: String let fltDirection: Int let schedDepTime: Date let estDepTime: Date let schedArrTime: Date let estArrTime: Date let actualTime: String? let origZuluOffset: String let destZuluOffset: String let destGate: String? let origGate: String? let codeShares: [CodeShare] enum CodingKeys: String, CodingKey { case fltId = "FltId" case carrier = "Carrier" case orig = "Orig" case dest = "Dest" case cutOffTime = "CutOffTime" case fltDirection = "FltDirection" case schedDepTime = "SchedDepTime" case estDepTime = "EstDepTime" case schedArrTime = "SchedArrTime" case estArrTime = "EstArrTime" case actualTime = "ActualTime" case origZuluOffset = "OrigZuluOffset" case destZuluOffset = "DestZuluOffset" case destGate = "DestGate" case origGate = "OrigGate" case codeShares = "CodeShares" } }
第三步:关键细节要注意
- 可选类型的必要性:像
actualTime、origGate,还有CodeShare里的fltId和carrier,这些在JSON里可能是空字符串或者直接缺失,必须设为String?,不然解码时肯定会抛出KeyNotFound。 - 日期解码配置:你的日期是ISO8601格式(比如"2018-03-21T01:25:00"),解码时一定要给JSONDecoder设置日期策略,不然日期字段会解码失败:
let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 // 假设data是你从POSTMAN拿到的响应数据 do { let flights = try decoder.decode([Flight].self, from: data) print("解码成功:\(flights)") } catch { // 精准排查错误的小技巧 if let keyError = error as? DecodingError.KeyNotFound { print("找不到的键:\(keyError.key),路径:\(keyError.context.codingPath)") } else { print("解码错误:\(error)") } }
第四步:如果还是报错怎么办?
用上面代码里的错误捕获逻辑,打印出具体找不到的键和路径,就能精准定位到是哪个属性没匹配上,要么调整模型的属性名,要么检查CodingKeys的映射就行。
内容的提问来源于stack exchange,提问作者Ackman
相关产品推荐
相关产品推荐

