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

SwiftUI使用URLSession+JSONDecoder解析数据后List不显示如何解决

你的代码存在以下几处问题,修复后即可正常在List中展示数据:

  • 模型字段类型与接口返回不匹配:目标接口返回的userId和id均为整数类型,你当前定义为String会直接触发JSON解析错误
  • 解析目标类型错误:接口返回的是由多条帖子组成的数组,你当前解析的是单个ResponseData对象,类型不匹配会导致解析失败
  • 解析结果未绑定状态变量:你解析得到的结果没有赋值给@State修饰的responseData,视图无法收到数据变更的通知
  • 异步逻辑适配问题:你在async标记的函数中使用了基于闭包回调的dataTask方法,且闭包默认在后台线程执行,直接修改UI状态会存在异常,建议直接使用URLSession原生的async/await接口适配当前异步上下文

修复后的完整代码

模型代码

struct ResponseData: Codable, Identifiable {
    var userId: Int
    var id: Int
    var title: String
    var body: String
}

新增Identifiable协议适配后,List可以自动识别id字段,无需手动指定。

ContentView代码

import SwiftUI

struct ContentView: View {
    @State private var responseData = [ResponseData]()
    
    var body: some View {
        List(responseData) { item in
            VStack(alignment: .leading, spacing: 4) {
                Text(item.title)
                    .font(.headline)
                Text(item.body)
                    .font(.body)
                    .foregroundColor(.secondary)
            }
            .padding(.vertical, 4)
        }
        .task {
            await loadData()
        }
    }

    func loadData() async {
        let urlString = "https://jsonplaceholder.typicode.com/posts"
        guard let url = URL(string: urlString) else { return }
        
        do {
            let (data, _) = try await URLSession.shared.data(from: url)
            responseData = try JSONDecoder().decode([ResponseData].self, from: data)
        } catch {
            print("加载失败:\(error.localizedDescription)")
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:45:03