【问题标题】:Swift Error: keyNotFound No value associated with key CodingKeysSwift 错误:keyNotFound 没有与键 CodingKeys 关联的值
【发布时间】:2021-12-31 04:49:50
【问题描述】:

尝试解析 JSON 响应并遇到此错误。

keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "没有值与键 CodingKeys(stringValue: "id", intValue: nil) ( "id").", 底层错误:nil))

由于响应包含一个 id,我并没有明确为什么它首先要为 id 寻找 CodingKey。

这是来自服务器的 JSON 响应:

{
    "answer": {
        "id": 6,
        "title": "Here is the postman API answer",
        "ownerId": 1
    }
}

这是我试图将其合并到的结构:

// MARK: - Answer
struct Answer: Codable {
    let id: Int
    let title: String
    let ownerID: Int
    let questionID, projectID: Int?

    enum CodingKeys: String, CodingKey {
        case id, title
        case ownerID = "ownerId"
        case questionID = "questionId"
        case projectID = "projectId"
    }
}

函数如下:

func createAnswer(questionId: Int, title: String, completed: @escaping(Result<Answer, AuthenticationError>) -> Void){
guard let url = URL(string: "https://mywebsitehere.com/api") else {
    completed(.failure(.custom(errorMessage:"URL unavailable")))
    return
}

guard let Accesstoken = UserDefaults.standard.string(forKey: "access-token") else { return }
guard let client = UserDefaults.standard.string(forKey: "client") else { return }
guard let uid = UserDefaults.standard.string(forKey: "userEmail") else { return }

let body = AnswerCreateBody(title: title)

var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue(Accesstoken, forHTTPHeaderField: "access-token")
        request.addValue(client, forHTTPHeaderField: "client")
        request.addValue(uid, forHTTPHeaderField: "uid")
        request.addValue("Bearer", forHTTPHeaderField: "Tokentype")
        request.addValue("keep-alive", forHTTPHeaderField: "Connection")
        request.httpBody = try? JSONEncoder().encode(body)

URLSession.shared.dataTask(with: request) { (data, response, error) in
    
    if let response = response as? HTTPURLResponse {
        
        let statusCode = response.statusCode
        
        if (statusCode != 200){
            print(statusCode)
            completed(.failure(.custom(errorMessage: "Authentication Failed.  Need to login again")))
        }

        guard let data = data, error == nil else { return }
        do {
         let answerCreateResponse = try JSONDecoder().decode(Answer.self, from: data)
         completed(.success(answerCreateResponse))
            print(answerCreateResponse)
        } catch {
            print(error)
        }
    }
}.resume()
}

为什么会出现这个错误,我该如何纠正?

【问题讨论】:

  • 要检查您从服务器返回的数据,您能否将print("--&gt; data: \(String(data: data, encoding: .utf8))") 放在guard let data = data, error == nil else { return } 之后,然后向我们展示它打印的内容。

标签: json swift jsonparser


【解决方案1】:

这是一个常见的错误。您忽略了根对象,带有键 answer 的字典当然没有键 id

添加这个结构

struct Root: Decodable {
    let answer : Answer
}

解码

let answerCreateResponse = try JSONDecoder().decode(Root.self, from: data).answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多