如何从 GET 请求中调用在 Swift 中具有较长嵌套 JSON 结构的已解析数据?
How do i call the parsed data from the GET request that have a longer nested JSON structure in Swift?
注意:请原谅我的无能,我对此还是个新手。完整代码贴在底部。
问题:似乎当我有一个短嵌套时,我可以为我的@Published 属性 调用它但是当我尝试一个带有较长嵌套的 api 请求时,like this. 并键入遵循 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
I get an error message, that says "Value of type '[TravelDetail]' has no member 'Leg'
我不确定为什么,但是当我在 @Published var 中使用 [TravelDetail]()
而不是 [TripTest]()
并在 dataSet1 的 Trip before Leg 处停止时,它会起作用,那么它似乎至少构建成功。但是现在我无法从请求中获取名称和类型信息
完整代码
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))
}
}
}
Trip
是一个数组(注意[]
)
例如,您需要通过索引获取数组中的一项
tripJSON.TripList.Trip.first?.Leg
要将值分配给非可选数组写入
self.dataSet1 = tripJSON.TripList.Trip.first?.Leg ?? []
注意:请原谅我的无能,我对此还是个新手。完整代码贴在底部。
问题:似乎当我有一个短嵌套时,我可以为我的@Published 属性 调用它但是当我尝试一个带有较长嵌套的 api 请求时,like this. 并键入遵循 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
I get an error message, that says "Value of type '[TravelDetail]' has no member 'Leg'
我不确定为什么,但是当我在 @Published var 中使用 [TravelDetail]()
而不是 [TripTest]()
并在 dataSet1 的 Trip before Leg 处停止时,它会起作用,那么它似乎至少构建成功。但是现在我无法从请求中获取名称和类型信息
完整代码
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))
}
}
}
Trip
是一个数组(注意[]
)
例如,您需要通过索引获取数组中的一项
tripJSON.TripList.Trip.first?.Leg
要将值分配给非可选数组写入
self.dataSet1 = tripJSON.TripList.Trip.first?.Leg ?? []