Как мне вызвать проанализированные данные из запроса GET, которые имеют более длинную вложенную структуру JSON в Swift? - PullRequest
1 голос
/ 19 июня 2020

ПРИМЕЧАНИЕ: Простите мою невежественность, я все еще новичок в этом отношении. Полный код размещен внизу.

ПРОБЛЕМА: Кажется, что когда у меня короткое гнездо, я могу вызвать его для своего свойства @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»

Я не уверен, почему, но это работает, когда я использую [TravelDetail]() вместо [TripTest]() в @Published var и остановитесь на Trip перед Leg для dataSet1, тогда он, по крайней мере, построится успешно. Но теперь я не могу получить информацию об имени и типе из запроса

Полный код

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 Ответ

0 голосов
/ 19 июня 2020

Trip - это массив (обратите внимание на [])

Вам нужно получить один элемент массива по индексу, например

tripJSON.TripList.Trip.first?.Leg

Чтобы присвоить значение запись в необязательный массив

self.dataSet1 = tripJSON.TripList.Trip.first?.Leg ?? []
...