Swift中API返回嵌套JSON转Codable结构问题求助
你的修改完全正确,已经解决了JSON解析的核心问题
先给你吃个定心丸:你调整后的Codable结构和解析逻辑是完全正确的,能够准确把JSON数据转换成你需要的User数组,用于SwiftUI的List展示。
为什么之前的代码会失败?
你一开始的错误很典型:JSON里的users数组每个元素是一个复合对象(包含position和嵌套的user对象),但你直接把users映射成[User]类型,这就导致JSONDecoder找不到匹配的结构,解析失败。
你的修改做对了哪些事?
- 新增
UserType中间结构体:这个结构体完美对应JSON里users数组的每个元素,包含position和user两个属性,让Codable能够正确解析数组的层级结构。 - 正确转换数组:在解析完成后,你用
map { $0.user }把[UserType]转换成[User],刚好适配SwiftUI展示需要的User数组,这一步处理得非常到位。 - 简化
User的CodingKeys:因为User的属性名和JSON里的键完全一致,其实这个CodingKeys可以省略(写了也不影响),代码会更简洁。
可以优化的小细节
为了让代码更健壮和符合SwiftUI的最佳实践,还有两个小建议:
- 让
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 }
- 避免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
相关产品推荐
相关产品推荐

