在ID解码JSON时未找到密钥

p1iqtdky  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(198)

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

未找到密钥(编码密钥(字符串值:"id",整数值:nil)、Swift.解码错误.上下文(编码路径:[_JSON密钥(字符串值:"索引0",整数值:0)],调试说明:"没有与密钥CodingKeys关联的值(字符串值:"id",整数值:nil)("id")."",基础错误:无)

这是我的课

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()
}

这是我的UI代码

@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"
    }
]
djmepvbi

djmepvbi1#

请仔细阅读JSON。关键字id在哪里?这正是错误消息所说的。
我猜你的结构体符合Identifiable的 * 硬编码 * UUID。如果是这样,你必须添加CodingKeys以排除id被解码。

z9smfwbn

z9smfwbn2#

我认为id必须是optional,所以在你的代码中发生的是,JSON_VALUE试图写入id键,从你所展示的来看,很明显没有名为id的键。
我假设您可能也会遇到以下错误:

Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"id\", intValue: nil) (\"id\").", underlyingError: nil))

错误非常简单No value associated with key CodingKeys(stringValue: \"id\", intValue: nil) (\"id\").
这是可以解决的。
您的当前代码必须是:

struct RunClubsv2 {
    public var name :String
    public var location :String
    public var date :String
    public var category :String

}

问题出在public var name :String这一行,它可以通过在StringString?后面添加一个?来避免错误,这意味着您正在创建optionalnullable
最后,更新后的代码应该如下所示:

struct RunClubsv2 {
    public var name :String?
    public var location :String
    public var date :String
    public var category :String

}

相关问题