You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:00:59