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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:27:36