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

Swift中API返回嵌套JSON转Codable结构问题求助

你的修改完全正确,已经解决了JSON解析的核心问题

先给你吃个定心丸:你调整后的Codable结构和解析逻辑是完全正确的,能够准确把JSON数据转换成你需要的User数组,用于SwiftUI的List展示。

为什么之前的代码会失败?

你一开始的错误很典型:JSON里的users数组每个元素是一个复合对象(包含position和嵌套的user对象),但你直接把users映射成[User]类型,这就导致JSONDecoder找不到匹配的结构,解析失败。

你的修改做对了哪些事?

  1. 新增UserType中间结构体:这个结构体完美对应JSON里users数组的每个元素,包含position和user两个属性,让Codable能够正确解析数组的层级结构。
  2. 正确转换数组:在解析完成后,你用map { $0.user }把[UserType]转换成[User],刚好适配SwiftUI展示需要的User数组,这一步处理得非常到位。
  3. 简化User的CodingKeys:因为User的属性名和JSON里的键完全一致,其实这个CodingKeys可以省略(写了也不影响),代码会更简洁。

可以优化的小细节

为了让代码更健壮和符合SwiftUI的最佳实践,还有两个小建议:

  1. 让User遵守Identifiable协议:SwiftUI的List直接遍历数组时,要求元素可识别。你可以用服务器返回的pk作为唯一标识(比本地生成UUID更合理):
struct User: Codable, Identifiable {
    var id: String { pk } // 用pk作为唯一id
    let pk: String
    let full_name: String
    let username: String
    let profile_pic_url: String
}
  1. 避免URL强制解包:URL(string: url)!的强制解包会在URL无效时导致崩溃,建议改成可选绑定:
init(url: String) {
    self.results = []
    guard let url = URL(string: url) else {
        DispatchQueue.main.async {
            self.errorState = true
            self.resultState = true
        }
        print("Widget: Invalid URL provided")
        return
    }
    URLSession.shared.dataTask(with: url) { data, response, error in
        // 原有的解析逻辑
    }.resume()
}

最后验证

调整后的代码运行后,fetch.results会正确填充服务器返回的User数组,SwiftUI的List也能正常渲染每个UserItem。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:43:12