提问者:小点点

如何从GET请求中调用在Swift中具有较长嵌套JSON结构的解析数据?


注意:请原谅我的无知,在这方面我还是个新手。 完整的代码张贴在底部。

问题:当我有一个较短的嵌套时,我似乎能够为@published属性调用它,但是当我尝试一个具有较长嵌套的api请求时,就像这样。 并在GET请求的结构之后键入可解码结构

struct TripScheduleTest: Codable {
    let TripList: InitialNest
}
struct InitialNest: Codable {
    var Trip: [TravelDetail]

}
struct TravelDetail: Codable {
    var Leg: [TripTest]
}
struct TripTest: Codable, Hashable {
    var name: String
    var type: String
}

我无法为@published var dataSet1=[TripTest]()调用它

                self.dataSet1 = tripJSON.TripList.Trip.Leg

我收到一条错误消息,说“类型'[TravelDetail]'的值没有成员'LEG'”

我不知道为什么,但是当我在@published var中使用[TravelDetail]()而不是[TripTest](),并且在dataSet1的Leg之前停止Trip时,它至少可以成功构建。 但现在我无法从请求中获取名称和类型信息

全码

import SwiftUI

struct TripScheduleTest: Codable {
    let TripList: InitialNest
}
struct InitialNest: Codable {
    var Trip: [TravelDetail]

}
struct TravelDetail: Codable {
    var Leg: [TripTest]
}
struct TripTest: Codable, Hashable {
    var name: String
    var type: String
}



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)
                print(data)
                DispatchQueue.main.async {
                    self.dataSet1 = tripJSON.TripList.Trip.Leg
                }





            } catch {
                print("JSON Decode error: ", error)
            }
        }.resume()
    }
}


struct TripView: View {

@ObservedObject var vm = TripViewModel()

var body: some View {


    List(vm.dataSet1, id: \.self) { day in
        Text("Test")
            .font(.system(size: 12, weight: .bold))
        Text(" \(day.name)")
            .font(.system(size: 12))
    }
}

}


共1个答案

匿名用户

trip是数组(请注意[])

例如,您需要通过索引获取数组的一项

tripJSON.TripList.Trip.first?.Leg

但是由于dataset1声明为[TravelDetail],您必须分配

self.dataSet1 = tripJSON.TripList.Trip