【问题标题】:keynotfound on id decoding JSONid解码JSON上的keynotfound
【发布时间】:2025-11-25 18:50:02
【问题描述】:

我在尝试解码 JSON 时收到以下错误。奇怪的是我在其他端点上使用了类似的代码,使用 UUID 没有问题。

错误:

keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "没有与键 CodingKeys 关联的值(stringValue: "id", intValue: nil) ("id").", underlyingError: nil))

这是我的课

class Api: ObservableObject {
@State private var showingAlert = false

// completion handler for JSON Data
func getUserData(url: String, completion : @escaping ([RunClubsv2])->()){

    let session = URLSession(configuration: .default)

    session.dataTask(with: URL(string: url)!) { (data, _, err) in

        if err != nil{

            print(err!.localizedDescription)
            return
        }
        //decoding JSON

        do {

            let users = try JSONDecoder().decode([RunClubsv2].self, from: data!)
            print(users)
            //returning data
            completion(users)

        }
        catch{
            print(error)
        }
    }
.resume()
}

这是我的用户界面代码


    @State var runclubv2: [RunClubsv2] = []

    var body: some View {
        VStack {
            if runclubv2.isEmpty{
                Text("damn it")
            }
            else {

                //display data
                List(runclubv2) { runclubv2 in
                    Text(runclubv2.name)
                }

            }

        }
        .onAppear{
            Api().getUserData(url: "<URL EndPoint>") { ([RunClubsv2]) in
                self.runclubv2 = self.runclubv2
            }
        }
    }
}

这是响应数据

[
    {
        "name": "Joggers for Lagers",
        "location": "Amor Artis Brewery, Fort Mill",
        "date": "6:30 PM",
        "category": "Monday"
    },
    {
        "name": "Old Armor Run Club",
        "location": "Kannapolis",
        "date": "6:00 PM",
        "category": "Monday"
    }
]

【问题讨论】:

  • 你的id 结构中有一个id 属性,它可能需要是可选的:)
  • 创建一个 CodingKey 枚举,其中仅包含您从 json 获得的属性(不包括我假设的 id)所以enum CodingKeys: String, CodingKey { case name, location, date, category }
  • 你不能让 UUID() 成为我认为的可选项。
  • @Robert 你可以手动生成id(如果你需要的话)而不是从 JSON 中解码它,因为它不存在。

标签: json swift swiftui jsondecoder


【解决方案1】:

请仔细阅读 JSON。 id 的密钥在哪里?这正是错误消息所说的内容。

我猜你的结构符合Identifiable硬编码 UUID。如果是这样,您必须添加 CodingKeys 以排除 id 被解码。

【讨论】:

  • 我不明白。我有一个类似的 API 调用,带有类似的 struct,但我没有收到此错误,也没有包含 id
  • 错误很明显。解码器尝试解码 JSON 中显然不存在的密钥 id。因此你必须添加CodingKeys...
  • 是的,我可以阅读:)。我不明白的是,我如何才能拥有两个具有相似结构的相似功能,一个有效,一个无效。
  • 相似不等于 ?