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

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"
    }
}

第三步:关键细节要注意

  1. 可选类型的必要性:像actualTime、origGate,还有CodeShare里的fltId和carrier,这些在JSON里可能是空字符串或者直接缺失,必须设为String?,不然解码时肯定会抛出KeyNotFound。
  2. 日期解码配置:你的日期是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:43:27