Как получить результат JSON от API Amadeus (Kotlin Android) - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать API поиска предложений Amadeus со следующим кодом:

when (val flightOffers = amadeus.shopping.flightOffersSearch.get(
        originLocationCode = "MDZ",
        destinationLocationCode = "MAD",
        departureDate = LocalDate.parse("2020-11-11").toString(),
        adults = 2,
        max = 1
    )) {
        is ApiResult.Success -> {
            if (flightOffers.succeeded) {
                println("RESULT SUCCEEDED")
                println(flightOffers.data)
            }
            else
            {
                println("RESULT DIDN'T SUCCEEDED")
            }
        }
        is ApiResult.Error -> {
            println("RESULT ERROR")
        }
    }

И если я скомпилирую, вывод logcat будет следующим:

I/System.out: RESULT SUCCEEDED

Что заставляет меня думать, что flightOffers.data пуст.

Однако, если я попробую этот код:

val flightOffers = amadeus.shopping.flightOffersSearch.get(
        originLocationCode = "MDZ",
        destinationLocationCode = "MAD",
        departureDate = LocalDate.parse("2020-11-11").toString(),
        adults = 2,
        max = 1
    )
    println("AMADEUS: $flightOffers")

, я получу следующий вывод:

I/System.out: AMADEUS: Success(meta=Meta(count=1, links={self=https://test.api.amadeus.com/v2/shopping/flight-offers?originLocationCode=MDZ&destinationLocationCode=MAD&departureDate=2020-11-11&adults=2&max=1}), data=[FlightOfferSearch(type=flight-offer, id=1, source=GDS, instantTicketingRequired=false, nonHomogeneous=false, oneWay=false, lastTicketingDate=2020-05-03, numberOfBookableSeats=7, itineraries=[Itinerary(duration=PT18H, segments=[SearchSegment(departure=AirportInfo(iataCode=MDZ, terminal=null, at=2020-11-11T07:10:00), arrival=AirportInfo(iataCode=AEP, terminal=null, at=2020-11-11T08:45:00), carrierCode=AR, number=1403, aircraft=Aircraft(code=738), duration=PT1H35M, id=1, numberOfStops=0, blacklistedInEU=false, co2Emissions=null), SearchSegment(departure=AirportInfo(iataCode=EZE, terminal=A, at=2020-11-11T13:25:00), arrival=AirportInfo(iataCode=MAD, terminal=1, at=2020-11-12T05:10:00), carrierCode=UX, number=42, aircraft=Aircraft(code=789), duration=PT11H45M, id=2, numberOfStops=0, blacklistedInEU=false, co2Emissions=null)])], price=SearchPrice(currency=EUR, total=1151.26, base=510.0, fees=[Fee(amount=0.0, type=SUPPLIER), Fee(amount=0.0, type=TICKETING)], grandTotal=1151.26), pricingOptions=PricingOptions(includedCheckedBagsOnly=true, fareType=[PUBLISHED], corporateCodes=null, refundableFare=false, noRestrictionFare=false, noPenaltyFare=false), validatingAirlineCodes=[UX], travelerPricings=[TravelerPricing(travelerId=1, fareOption=STANDARD, travelerType=ADULT, price=SearchPrice(currency=EUR, total=575.63, base=255.0, fees=null, grandTotal=0.0), fareDetailsBySegment=[FareDetailsBySegment(segmentId=1, cabin=ECONOMY, fareBasis=ZYYOPO, segmentClass=Q, includedCheckedBags=IncludedCheckedBags(weight=0, weightUnit=null)), FareDetailsBySegment(segmentId=2, cabin=ECONOMY, fareBasis=ZYYOPO, segmentClass=Z, includedCheckedBags=IncludedCheckedBags(weight=0, weightUnit=null))]), TravelerPricing(travelerId=2, fareOption=STANDARD, travelerType=ADULT, price=SearchPrice(currency=EUR, total=575.63, base=255.0, fees=null, grandTotal=0.0), fareDetailsBySegment=[FareDetailsBySegment(segmentId=1, cabin=ECONOMY, fareBasis=ZYYOPO, segmentClass=Q, includedCheckedBags=IncludedCheckedBags(weight=0, weightUnit=null)), FareDetailsBySegment(segmentId=2, cabin=ECONOMY, fareBasis=ZYYOPO, segmentClass=Z, includedCheckedBags=IncludedCheckedBags(weight=0, weightUnit=null))])])], dictionaries={locations={MAD={cityCode=MAD, countryCode=ES}, EZE={cityCode=BUE, countryCode=AR}, MDZ={cityCode=MDZ, countryCode=AR}, AEP={cityCode=BUE, countryCode=AR}}, aircraft={789=BOEING 787-9, 738=BOEING 737-800}, currencies={EUR=EURO}, carriers={AR=AEROLINEAS ARGENTINAS, UX=AIR EUROPA}})

Это означает, что API возвращает JSON, но тогда я не могу использовать flightOffers с gson для передачи этих данных в DataClass, потому что flightOffers - это ApiResult>, и я не знаю, как его использовать. В соответствии с их библиотекой документации это должно быть сделано так, как я это сделал с первой попытки.

Я ценю всю помощь и советы, которые я могу получить. Это мое первое приложение Android.

1 Ответ

1 голос
/ 30 апреля 2020

Приятно видеть, что у нас есть новый Android разработчик в сообществе!

Итак, во-первых, в Android вы должны избегать использования println, вместо этого вы должны использовать Log.d/e/w/i, этот метод будет печатать ваш результат в android logcat.

Для того, что я вижу, вы успешно настроили свой проект и где можно сделать запрос из SDK.

В android SDK, каждый get() даст вам правильный объект данных, а не просто JSON. Вам не нужно заботиться о разборе ответа. То, что у вас есть в вашем flightOffers.data, - это на самом деле List<FlightOfferSearch>, который вы можете использовать прямо сейчас!

...