在SwiftUI中如何从JSON数组中提取特定嵌套数据块?
实现思路
你要的效果用系统自带的API就能实现,不需要引入第三方库,整体分3步走:先定义和JSON结构匹配的Codable数据模型,再解析JSON数据,最后把需要的嵌套字段绑定到SwiftUI视图上展示即可。
具体实现步骤
- 第一步:定义和JSON结构匹配的数据模型
举个示例,假设你的JSON是带嵌套地址的用户数据:
{ "user_id": 123, "username": "张三", "delivery_address": { "city": "北京", "street": "中关村大街1号", "postcode": "100080" } }
对应定义Swift模型,系统的Codable协议可以直接完成JSON到Swift对象的映射:
// 嵌套的地址子模型 struct Address: Codable { let city: String let street: String let postcode: String } // 顶层数据模型 struct User: Codable { let userId: Int let username: String let deliveryAddress: Address }
如果你的JSON字段都是蛇形命名(比如user_id这种),可以在解析时设置keyDecodingStrategy = .convertFromSnakeCase,不需要手动写CodingKeys做映射,更省事。
- 第二步:解析JSON数据
先把你的JSON文件拖入Xcode项目,记得勾选 Copy items if needed 和你的APP target。然后给Bundle加个扩展用于通用解析:
extension Bundle { func parseJSON<T: Codable>(fileName: String) -> T { guard let fileUrl = url(forResource: fileName, withExtension: nil), let jsonData = try? Data(contentsOf: fileUrl), let result = try? JSONDecoder().decode(T.self, from: jsonData) else { fatalError("JSON解析失败,请检查文件名、结构是否和模型匹配") } return result } }
需要解析的时候直接调用即可,比如你的JSON文件叫user_data.json:
let user: User = Bundle.main.parseJSON(fileName: "user_data.json")
- 第三步:在SwiftUI视图中展示指定嵌套数据
直接访问嵌套属性就能拿到你要的特定数据块,示例视图代码:
struct ContentView: View { // 提前解析好的JSON数据 let user: User = Bundle.main.parseJSON(fileName: "user_data.json") var body: some View { VStack(alignment: .leading, spacing: 12) { Text("用户名:\(user.username)") .font(.headline) // 展示你需要的嵌套地址块 Group { Text("收货地址:") .font(.subheadline) .fontWeight(.medium) Text(user.deliveryAddress.city) Text(user.deliveryAddress.street) Text("邮编:\(user.deliveryAddress.postcode)") } .padding(.leading, 12) } .padding() } }
新手常见问题说明
- 如果需要提取多个同类嵌套数据块,可以把需要的字段筛选后存入数组,用
ForEach遍历生成列表视图即可。 - 如果JSON里的字段可能为空,把模型中对应属性定义为可选类型(比如
let postcode: String?)即可避免解析报错。 - 不需要引入第三方JSON解析库,系统自带的
Codable能力完全覆盖常规需求,学习成本更低。
内容的提问来源于stack exchange,提问作者Rene Robles
相关产品推荐
相关产品推荐

