ios - 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)
}
}
解决方案
这是因为您的解码模型不正确。使用以下模型:
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]
}
推荐阅读
- selenium - isDisplayed 方法出现错误?
- android - 评级明星从最后开始削减
- kubernetes - Kubespray:如何为一个节点添加多个 GlusterFS 磁盘卷设备
- python - Pandas:基于现有行的新行
- php - 有没有办法在 linux 服务器托管 shell_exec 函数的 php 中获取 pc 名称(主机名)
- asp.net-core - ASP.net Core Web API Swagger UI 版本字段 - 是否可以在代码中设置此值?
- python - python中一个变量的内容何时与另一个变量的内容保持不变
- go - COM 中的 UTF-16 字符串
- regex - 为什么 JFlex 拒绝 .+?(?=->)
- sql-server - 使用循环 SQL Server 更新