首页 > 解决方案 > json 响应的 codableKey 中的 keyNotFound

问题描述

Json 响应解析为 dis 错误 KeyNotFound 的可编码字符串。可编码到包装类时的 KeyNotFound

    Unexpected error: keyNotFound(CodingKeys(stringValue: "id", intValue: nil), 
Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "data", intValue: nil)], 
debugDescription: "No value associated with key CodingKeys(stringValue: \"id\", intValue: nil)
 (\"id\").", underlyingError: nil)).

响应数据

{
    "msg": {
        "success": [
            ""
        ]
    },
    "data": {
        "jobs": {
            "current_page": 1,
            "data": [
                {
                    "id": 154,
                    "user": "UserName"}
]
}
}
}

服务电话

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error {
        print("error: \(error)")
    } else {
        if let response = response as? HTTPURLResponse {
            print("statusCode: \(response.statusCode)")
        }
        if let data = data, let dataString = String(data: data, encoding: .utf8) {
            let jsonData = dataString.data(using: .utf8)!

            do {
                let jsonDecoder = JSONDecoder()
                let user = try jsonDecoder.decode(JobListModel.self, from: data)
                print("Hello \(user.msg )")
            } catch {
                print("Unexpected error: \(error).")
            }
        }
    }
}

模型类。

struct JobListModel: Codable {

    let msg: Msg
    let data: Data

    private enum CodingKeys: String, CodingKey {
        case msg = "msg"
        case data = "data"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        msg = try values.decode(Msg.self, forKey: .msg)
        data = try values.decode(Data.self, forKey: .data)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(msg, forKey: .msg)
        try container.encode(data, forKey: .data)
    }

}

标签: iosswiftcodable

解决方案


这是因为您的解码模型不正确。使用以下模型:

struct JobListModel: Codable {
    let msg: Msg
    let data: JobListData
}

struct JobListData: Codable {
    let jobs: Jobs
}

struct Jobs: Codable {
    let currentPage: Int
    let data: [JobData]

    enum CodingKeys: String, CodingKey {
        case currentPage = "current_page"
        case data
    }
}

struct JobData: Codable {
    let id: Int
    let user: String
}

struct Msg: Codable {
    let success: [String]
}

推荐阅读