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

Swift中使用URLSession和dataTask如何解码返回JSON的title等属性

错误原因

你解码失败的核心原因有两个:

  • API返回的JSON顶层是数组结构,你当前解码逻辑是按单个SpaceNewsModel对象解析,类型完全不匹配
  • 你的模型里新增了本地生成的id = UUID()属性,没有指定CodingKeys的话,解码器会默认从JSON里找id字段,找不到也会触发解码错误
修复方案

第一步:修正数据模型

给模型添加CodingKeys枚举,只列出JSON中实际存在的三个字段,跳过本地生成的id属性:

struct SpaceNewsModel: Identifiable, Codable {
    var id = UUID()
    let title: String
    let url: String
    let source: String

    enum CodingKeys: String, CodingKey {
        case title, url, source
    }
}

第二步:修正解码逻辑

把解码目标类型从单个SpaceNewsModel.self改成数组类型[SpaceNewsModel].self,匹配顶层数组结构,解码后遍历数组即可打印每条数据的属性:

let decoder = JSONDecoder()
if let safeData = data {
    do {
        // 解码为模型数组
        let astroNews = try decoder.decode([SpaceNewsModel].self, from: safeData)
        // 遍历输出每条内容
        astroNews.forEach { news in
            print("标题:\(news.title)")
            print("链接:\(news.url)")
            print("来源:\(news.source)")
            print("------------------------")
        }
    } catch {
        print("DEBUG: Error getting news articles \(error.localizedDescription)")
    }
}
注意事项
  • 你贴的示例JSON末尾多了一个多余的尾逗号,标准JSON不允许这种写法,如果是本地测试数据记得删掉,正式API返回的内容一般不会有这个问题
  • 解码类型和JSON结构的对应规则很简单:JSON最外层是{}包裹的对象就传单个模型类型,最外层是[]包裹的数组就传对应模型的数组类型

内容的提问来源于stack exchange,提问作者Tomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:09:26