Swift中CVE JSON解码错误排查及arrCVE数据访问咨询
Swift解码CVE API JSON数据的问题解决与数据访问指南
1. 解码错误根源
你当前解码语句JSONDecoder().decode([CVEdata].self, from: data)的核心问题是:API返回的JSON根节点是包含results数组的对象,而非直接的数组结构。强行解码成数组类型必然触发错误。
2. 修正结构体定义
首先要定义对应JSON根节点的结构体,再嵌套单个CVE数据的模型。示例如下:
// 对应API返回的顶层JSON对象 struct CVEResponse: Decodable { let results: [CVEdata] } // 单个CVE数据模型,根据API返回字段调整属性 struct CVEdata: Decodable { let id: String let title: String let description: String // 其他需要的字段,与API返回key严格匹配 }
如果API返回的是蛇形命名(比如cve_id),可通过编码键映射或自动转换简化:
// 方式1:手动映射编码键 extension CVEdata { enum CodingKeys: String, CodingKey { case id = "cve_id" case title = "cve_title" case description = "cve_description" } } // 方式2:自动转换蛇形命名为驼峰 let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase
3. 修正异步请求解码逻辑
调整解码目标为根节点结构体,提取内部的results数组作为最终数据:
func fetchCVEData() async throws -> [CVEdata] { guard let url = URL(string: "你的API地址") else { throw NSError(domain: "InvalidURL", code: 0, userInfo: nil) } let (data, _) = try await URLSession.shared.data(from: url) let decoder = JSONDecoder() decoder.keyDecodingStrategy = .convertFromSnakeCase // 可选,根据API命名规则调整 let response = try decoder.decode(CVEResponse.self, from: data) return response.results }
4. 正确访问arrCVE数据
获取到arrCVE数组后,可通过下标、遍历等方式访问元素属性:
Task { do { let arrCVE = try await fetchCVEData() // 访问单个元素(需判断数组非空) if let firstCVE = arrCVE.first { print("CVE ID:\(firstCVE.id)") print("标题:\(firstCVE.title)") } // 遍历所有CVE数据 for cve in arrCVE { print("[\(cve.id)] \(cve.title)") } } catch { print("请求/解码错误:\(error.localizedDescription)") } }
内容的提问来源于stack exchange,提问作者sugarakis
相关产品推荐
相关产品推荐

