Go: использование JSON Unmarshal внутри цикла for - PullRequest
0 голосов
/ 24 января 2020

Я новичок в Go, и у меня возникла проблема с моим кодом, касающаяся использования json .Unmarshal несколько раз в течение для l oop.

В этом коде первый две функции извлекают ответ из URL, преобразуют его в байтовый формат, а затем распаковывают в данные. Последняя функция выполняет итерацию по списку URL-адресов и должна разбирать их по очереди, каждый раз добавляя массив с набором кодов полета.

Используя набор структур, который я использовал здесь, я возможность использовать getFlightData для одного URL, который будет печатать набор кодов рейсов. Однако при попытке выполнить то же самое в течение 1 oop массив flightToSunnyCities напечатает набор квадратных скобок с пустым пространством внутри. Печать thisNumber в пределах для l oop во время итерации аналогичным образом выведет пустое пространство.

var data ScheduledFlight

func UnmarshalBodyToPointerFlight(Body []byte, welcome *ScheduledFlight) {
    err2 := json.Unmarshal(Body, &welcome)
    if err2 != nil {
        fmt.Println(err2)
        os.Exit(1)
    }
}

func GetFlightData(url string) *ScheduledFlight {
    res := FetchResponse(url)
    body := ResponseBodyToByte(res)
    UnmarshalBodyToPointerFlight(body, &data)
    return &data
}

func UnmarshalFlightStatsURL() []string {
    urlList := listOfURL()
    var flightsToSunnyCities []string
    for _, item := range urlList {

        var flightStats *ScheduledFlight = GetFlightData(item)
        var thisNumber string = flightStats.FlightNumber
        flightsToSunnyCities = append(flightsToSunnyCities, thisNumber)

    }
    fmt.Println(flightsToSunnyCities)
    return flightsToSunnyCities
}

Структуры, которые я использую, показаны здесь:

type Welcome struct {
    ScheduledFlights []ScheduledFlight `json:"scheduledFlights"`
}

type ScheduledFlight struct {
    CarrierFSCode          string `json:"carrierFsCode"`
    FlightNumber           string `json:"flightNumber"`
    DepartureAirportFSCode string `json:"departureAirportFsCode"`
    ArrivalAirportFSCode   string `json:"arrivalAirportFsCode"`
}

Я подозреваю, что эта проблема возникает из-за ScheduledFlights типа []ScheduledFlight, который должен быть приходится, однако я в растерянности от того, каким будет решение. Если у кого-нибудь есть какой-либо совет, он будет очень признателен, спасибо.

1 Ответ

2 голосов
/ 24 января 2020

Способ, которым вы разбираете ввод JSON ниже, неверен:

func UnmarshalBodyToPointerFlight(Body []byte, welcome *ScheduledFlight){
err2 := json.Unmarshal(Body, &welcome)

Функция UnmarshalBodyToPointerFlight получает указатель ScheduledFlight, и вы хотите разархивировать ваши данные в место, на которое указывает этот указатель. Чтобы сделать это, вы должны позвонить:

err2 := json.Unmarshal(Body, welcome)

То, как вы это делаете, это перезаписать указатель welcome (а не место, на которое он указывает) и демаршалировать в новое место, потому что вы передали указатель на указатель. Из-за этого вы добавляете пустые строки к вашим данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...