Swift中如何正确调用GET请求长嵌套JSON解析后的数据?
解决嵌套JSON解析时的数组访问错误
你遇到的问题其实很典型——Trip是一个[TravelDetail]数组,而不是单个TravelDetail实例,所以你不能直接通过.Trip.Leg去访问属性,得先遍历数组里的每个元素,再取出它们的Leg数组,最后把这些数组合并成一个大数组。
错误原因拆解
看你的结构体定义:
struct InitialNest: Codable { var Trip: [TravelDetail] } // Trip是数组类型 struct TravelDetail: Codable { var Leg: [TripTest] } // 每个TravelDetail实例才有Leg属性
当你写tripJSON.TripList.Trip时,得到的是一个[TravelDetail]数组,数组本身没有Leg成员,只有数组里的单个TravelDetail对象才有Leg属性,这就是报错的核心原因。
修复方案:用flatMap扁平化嵌套数组
你需要把所有TravelDetail里的Leg数组合并成一个一维的[TripTest]数组,Swift的flatMap方法正好能帮你完成这个操作——它会遍历数组中的每个元素,取出嵌套的子数组,然后自动展开合并成一个新数组。
修改ViewModel里的赋值代码即可:
DispatchQueue.main.async { // flatMap遍历每个TravelDetail,取出它的Leg数组并合并 self.dataSet1 = tripJSON.TripList.Trip.flatMap { $0.Leg } }
完整修改后的ViewModel代码
class TripViewModel: ObservableObject { @Published var dataSet1 = [TripTest]() init() { let urlString = "http://xmlopen.rejseplanen.dk/bin/rest.exe/trip?originId=8600790&destId=6553&format=json" guard let url = URL(string: urlString) else { return } URLSession.shared.dataTask(with: url) { (data, resp, err) in guard let data = data else { return } do { let tripJSON = try JSONDecoder().decode(TripScheduleTest.self, from: data) DispatchQueue.main.async { self.dataSet1 = tripJSON.TripList.Trip.flatMap { $0.Leg } } } catch { print("JSON Decode error: ", error) } }.resume() } }
这样修改后,dataSet1就能正确获取到所有的TripTest实例,你的List也能正常显示day.name和day.type了。
另外提个小建议:Swift里的结构体和属性名通常用小驼峰命名(比如tripList而非TripList),如果API返回的字段是大驼峰格式,你可以通过CodingKeys来做字段映射,这样更符合Swift的编码规范。
内容的提问来源于stack exchange,提问作者27Nights
相关产品推荐
相关产品推荐

