[英]How do i call the parsed data from the GET request that have a longer nested JSON structure in Swift?
注意:請原諒我的無知,對此我還是個新手。 完整的代碼貼在底部。
問題:似乎當我有一個短嵌套時,我可以為我的@Published 屬性調用它,但是當我嘗試使用更長嵌套的 api 請求時, 像這樣。 和類型 Decodable 結構遵循 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] [TravelDetail]()
而不是[TripTest]()
並在數據集 1 的 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))
}
}
}
Trip
是一個數組(注意[]
)
例如,您需要通過索引獲取數組的一項
tripJSON.TripList.Trip.first?.Leg
將值分配給非可選數組寫入
self.dataSet1 = tripJSON.TripList.Trip.first?.Leg ?? []
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.