Необходимо манипулировать возвращенным JSON Object и извлекать часть в список - PullRequest
0 голосов
/ 10 июля 2020

Я использую внешний API, для которого возвращается объект JSON. В этом ответе Object содержится массив, который мне нужно извлечь и установить в список определенного типа сущности. Java, однако, не тот язык, с которым я хорошо знаком, поэтому у меня возникают проблемы при попытке понять это.

Я создал тип класса-оболочки для работы с этим в сеттер.

Лучшее, что я придумал для компиляции, приведено ниже, но выдает ошибку, которую я не могу понять.

public void setFlights(Object responseBody) {
    String responseString = responseBody.toString();
    JSONObject responseJSONObject = new JSONObject(responseString);
    JSONArray responseJSONArray = responseJSONObject.getJSONArray("flights");
    Gson gson = new Gson();
    Type flightType = new TypeToken<List<Flight>>() {}.getType();
    this.flights = gson.fromJson(String.valueOf(responseJSONArray), flightType);
}

Как видите, я ' Я как бы швыряю его в стену, чтобы посмотреть, прилипнет ли он. Я пытаюсь использовать Gson, чтобы обойти некоторые проблемы типа, с которыми я столкнулся.

При выполнении возникает ошибка:

org.json.JSONException: Expected a ':' after a key at 7 [character 8 line 1]

Строка ответа выглядит следующим образом: Изображение строки ответа

Если с этим трудно справиться, вот текст ответа:

INFO: {"FlightInfoResult":{"next_offset":-1,"flights":[{"ident":"N1RJ","aircrafttype":"HDJT","filed_ete":"01:25:00","filed_time":1593038253,"filed_departuretime":1593037500,"filed_airspeed_kts":400,"filed_airspeed_mach":"","filed_altitude":360,"route":"WEAZL4 CLAWD","actualdeparturetime":1593038285,"estimatedarrivaltime":1593043320,"actualarrivaltime":1593043320,"diverted":"","origin":"KJQF","destination":"KJXN","originName":"Concord-Padgett Rgnl","originCity":"Concord, NC","destinationName":"Jackson County","destinationCity":"Jackson, MI"},{"ident":"N1RJ","aircrafttype":"HDJT","filed_ete":"01:24:00","filed_time":1593000320,"filed_departuretime":1592998200,"filed_airspeed_kts":400,"filed_airspeed_mach":"","filed_altitude":350,"route":"PEGTE","actualdeparturetime":1593000420,"estimatedarrivaltime":1593005149,"actualarrivaltime":1593005149,"diverted":"","origin":"KJXN","destination":"KJQF","originName":"Jackson County","originCity":"Jackson, MI","destinationName":"Concord-Padgett Rgnl","destinationCity":"Concord, NC"},{"ident":"N1RJ","aircrafttype":"HDJT","filed_ete":"01:29:00","filed_time":1592518049,"filed_departuretime":1592513400,"filed_airspeed_kts":317,"filed_airspeed_mach":"","filed_altitude":360,"route":"WEAZL4 CLAWD","actualdeparturetime":1592517936,"estimatedarrivaltime":1592523120,"actualarrivaltime":1592523120,"diverted":"","origin":"KJQF","destination":"KJXN","originName":"Concord-Padgett Rgnl","originCity":"Concord, NC","destinationName":"Jackson County","destinationCity":"Jackson, MI"},{"ident":"N1RJ","aircrafttype":"HDJT","filed_ete":"01:24:00","filed_time":1592481020,"filed_departuretime":1592479800,"filed_airspeed_kts":319,"filed_airspeed_mach":"","filed_altitude":350,"route":"PEGTE","actualdeparturetime":1592481126,"estimatedarrivaltime":1592486100,"actualarrivaltime":1592486100,"diverted":"","origin":"KJXN","destination":"KJQF","originName":"Jackson County","originCity":"Jackson, MI","destinationName":"Concord-Padgett Rgnl","destinationCity":"Concord, NC"}]}}

Вполне может быть гораздо более простой способ выполнить то, что я необходимость. Любой пример помощи очень ценится.

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Я думаю, что невозможно получить внутренний элемент JSON напрямую с помощью gson. Вы должны получить FlightInfoResult, затем flights соответственно. Это должно работать:

    Gson gson = new Gson();
    JsonObject jsonObject = com.google.gson.JsonParser.parseString(responseString).getAsJsonObject();
    JsonArray flightArray = jsonObject.getAsJsonObject("FlightInfoResult").getAsJsonArray("flights");
    Type flightType = new TypeToken<List<Flight>>() {}.getType();
    List<Flight> flights = gson.fromJson(flightArray, flightType);

В любом случае, убедитесь, что имя всех свойств внутри класса Flight совпадает с именем Json элементов, чтобы избежать ошибок сопоставления. Поскольку вы не опубликовали определение класса Flight и правило именования gson, но класс Flight должен быть таким:

public class Flight {

  private String ident;
  private String aircrafttype;
  private String filed_ete;
  private float filed_time;
  private float filed_departuretime;
  private float filed_airspeed_kts;
  private String filed_airspeed_mach;
  private float filed_altitude;
  private String route;
  private float actualdeparturetime;
  private float estimatedarrivaltime;
  private float actualarrivaltime;
  private String diverted;
  private String origin;
  private String destination;
  private String originName;
  private String originCity;
  private String destinationName;
  private String destinationCity;

// getters setters
0 голосов
/ 10 июля 2020

Вы можете использовать строку Gson для класса сопоставления объектов напрямую, как показано ниже,

package com.sample.programs;

import java.util.List;
import com.google.gson.Gson;
public class FlightInfoResultMain {

public static void main(String[] args) {

    String input = "{\"FlightInfoResult\":{\"next_offset\":-1,\"flights\":[{\"ident\":\"N1RJ\",\"aircrafttype\":\"HDJT\",\"filed_ete\":\"01:25:00\",\"filed_time\":1593038253,\"filed_departuretime\":1593037500,\"filed_airspeed_kts\":400,\"filed_airspeed_mach\":\"\",\"filed_altitude\":360,\"route\":\"WEAZL4 CLAWD\",\"actualdeparturetime\":1593038285,\"estimatedarrivaltime\":1593043320,\"actualarrivaltime\":1593043320,\"diverted\":\"\",\"origin\":\"KJQF\",\"destination\":\"KJXN\",\"originName\":\"Concord-Padgett Rgnl\",\"originCity\":\"Concord, NC\",\"destinationName\":\"Jackson County\",\"destinationCity\":\"Jackson, MI\"},{\"ident\":\"N1RJ\",\"aircrafttype\":\"HDJT\",\"filed_ete\":\"01:24:00\",\"filed_time\":1593000320,\"filed_departuretime\":1592998200,\"filed_airspeed_kts\":400,\"filed_airspeed_mach\":\"\",\"filed_altitude\":350,\"route\":\"PEGTE\",\"actualdeparturetime\":1593000420,\"estimatedarrivaltime\":1593005149,\"actualarrivaltime\":1593005149,\"diverted\":\"\",\"origin\":\"KJXN\",\"destination\":\"KJQF\",\"originName\":\"Jackson County\",\"originCity\":\"Jackson, MI\",\"destinationName\":\"Concord-Padgett Rgnl\",\"destinationCity\":\"Concord, NC\"},{\"ident\":\"N1RJ\",\"aircrafttype\":\"HDJT\",\"filed_ete\":\"01:29:00\",\"filed_time\":1592518049,\"filed_departuretime\":1592513400,\"filed_airspeed_kts\":317,\"filed_airspeed_mach\":\"\",\"filed_altitude\":360,\"route\":\"WEAZL4 CLAWD\",\"actualdeparturetime\":1592517936,\"estimatedarrivaltime\":1592523120,\"actualarrivaltime\":1592523120,\"diverted\":\"\",\"origin\":\"KJQF\",\"destination\":\"KJXN\",\"originName\":\"Concord-Padgett Rgnl\",\"originCity\":\"Concord, NC\",\"destinationName\":\"Jackson County\",\"destinationCity\":\"Jackson, MI\"},{\"ident\":\"N1RJ\",\"aircrafttype\":\"HDJT\",\"filed_ete\":\"01:24:00\",\"filed_time\":1592481020,\"filed_departuretime\":1592479800,\"filed_airspeed_kts\":319,\"filed_airspeed_mach\":\"\",\"filed_altitude\":350,\"route\":\"PEGTE\",\"actualdeparturetime\":1592481126,\"estimatedarrivaltime\":1592486100,\"actualarrivaltime\":1592486100,\"diverted\":\"\",\"origin\":\"KJXN\",\"destination\":\"KJQF\",\"originName\":\"Jackson County\",\"originCity\":\"Jackson, MI\",\"destinationName\":\"Concord-Padgett Rgnl\",\"destinationCity\":\"Concord, NC\"}]}}";
    System.out.println("input - " + input);
    //Create Gson object
    Gson gson = new Gson();
    FlightInfoResultObject responseObject = gson.fromJson(input, FlightInfoResultObject.class);
    // parsing response to java pojo
    List<Flights> listOfFlights = responseObject.getFlightInfoResult().getFlights();
    for (Flights flight : listOfFlights) {
        System.out.println("flight - " + flight.getIdent());
    }
  }

}

Класс сопоставления объектов: Внутри Flight.class вы можете добавить все переменные, которые у вас есть в ответе json.

 class FlightInfoResultObject {

  FlightInfoResult FlightInfoResult;
  @Getter
  @Setter
 }

class FlightInfoResult {

   Integer next_offset;
   List<Flights> flights;
   @Getter
   @Setter
}

class Flights {
  String ident;
  String aircrafttype;
  @Getter
  @Setter
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...