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
相关产品推荐
相关产品推荐

