Разбор API json в сервлет Java

Я создаю страницу сервлета Java для школы, и я хотел бы поместить в нее API. Пока что у меня были проблемы с API.
Это "Schiphol PublicFlight API", который я хочу связать со своей веб-страницей. Однако я не могу заставить Java использовать API на основе JSON.

До сих пор я пытался «изолировать» все больше и больше JSON-кода, но никак не могу заставить его работать. Чтобы упростить мне задачу, я пока отделил код Java-сервлета от проекта. Итак, это мой код:

package nl.hva.ic103.johannes;

import java.io.FileReader;
import java.util.Iterator;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.*;

public class Main {

    public static void main(String[] args) throws Exception {
        JSONParser parser = new JSONParser();

        String flightnumber = "HV6672";
        HttpClient httpClient = HttpClients.createDefault();
        HttpGet request = new HttpGet("https://api.schiphol.nl/public-flights/flights?app_id=61439ff8&app_key=b313373fd4122e93704874c69a59233d&flightname = " + flightnumber + "&sort=%2Bscheduletime");
        request.addHeader("ResourceVersion", "v3");

        HttpResponse response = httpClient.execute(request);

        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");

            System.out.println(responseBody);

            JSONObject jsonObject = (JSONObject) parser.parse(responseBody);
            JSONObject jo = (JSONObject) jsonObject;

            String id = (String) jo.get("id");
            String lastName = (String) jo.get("flightName");

            System.out.println(id);
            System.out.println(lastName);

            JSONArray ja = (JSONArray) jo.get("flights");

            System.out.println(ja);
        }
    }
}

И это формат JSON, который мне дает API:

{
    "flights": [
    {
        "id": 125936439536285950,
        "flightName": "HV6672",
        "scheduleDate": "2018-12-26",
        "flightDirection": "A",
        "flightNumber": 6672,
        "prefixIATA": "HV",
        "prefixICAO": "TRA",
        "scheduleTime": "01:00:00",
        "serviceType": "J",
        "mainFlight": "HV6672",
        "codeshares": {
            "codeshares": [
                "KL2582"
            ]
        },
        "estimatedLandingTime": "2018-12-26T00:30:49.000+01:00",
        "actualLandingTime": "2018-12-26T00:30:55.000+01:00",
        "publicEstimatedOffBlockTime": null,
        "actualOffBlockTime": null,
        "publicFlightState": {
            "flightStates": [
                "LND",
                "EXP"
            ]
        },
        "route": {
            "destinations": [
                "TFS"
            ]
        },
        "terminal": 1,
        "gate": "D74",
        "baggageClaim": {
            "belts": [
                "6"
            ]
        },
        "expectedTimeOnBelt": "2018-12-26T01:16:53.669+01:00",
        "checkinAllocations": null,
        "transferPositions": null,
        "aircraftType": {
            "iatamain": "73H",
            "iatasub": "73H"
        },
        "aircraftRegistration": "PHHZX",
        "airlineCode": 164,
        "expectedTimeGateOpen": null,
        "expectedTimeBoarding": null,
        "expectedTimeGateClosing": null,
        "schemaVersion": "3"
    }
    ],
    "schemaVersion": "3"
}

Как я могу получить такие вещи, как «ворота», «терминал» и «тип самолета», проанализированные в моей java-программе? Я чувствую, что все, что я могу получить с этими результатами, - это как один фрагмент данных, и их невозможно разделить. Кто-нибудь знает, как проанализировать эти три результата в моем java-проекте? Более подробная информация об API указана на их веб-сайте: https://www.schiphol.nl/en/developer-center/page/our-flight-api-explored/

Вместо этого я мог бы рассмотреть возможность использования библиотеки GSON, которая может анализировать JSON в POJO.

MadProgrammer 26.12.2018 01:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
271
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
JSONArray ja = (JSONArray) jo.get("flights");
JsonObject flightRec = ja.getJsonObject(0);
String gate = (String) flightRec.get("gate");
//...etc

Какая проблема?

Я получаю сообщение «невозможно разрешить метод getJsonObject (int)» и «невозможно преобразовать com.google.gson.JsonElement в java.lang.String». Как мне тогда это исправить?

Johannes Kistemaker 26.12.2018 14:04

Вы используете gson? Попробуйте JsonObject rec = ja.get(0).getAsJsonObject(); String gate = rec.get("gate").getAsString();, подробности см. В руководстве к вашей json-библиотеке (static.javadoc.io/com.google.code.gson/gson/2.6.2/com/googl‌ e /…)

Crutch Master 27.12.2018 03:12

Я преобразовал все в Gson сейчас, и вместе с вашим кодом он, наконец, работает! Спасибо за вашу помощь

Johannes Kistemaker 31.12.2018 16:36

Другие вопросы по теме