1

これは私の前の質問の続きです。JSON リクエストを取得して JSON に変換した後、結果を Java オブジェクトに解析しようとしています。

public class NetClientGet {

  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
    String urlYesterday = "http://fids.changiairport.com/webfids/fidsp/get_flightinfo_cache.php?d=-1&type=pa&lang=en";
    String yesterdayJSON = getDataFromWeb(urlYesterday);
    //System.out.println("yesterdayJSON : " + yesterdayJSON);
    //jsonArray.add(yesterdayJSON);
    Gson gson = new Gson();
    List<FlightInfo> flightArray = (List<FlightInfo>) gson.fromJson(yesterdayJSON, FlightInfo.class);
    System.out.println("flightArray : " + flightArray);
  }

  private static String getDataFromWeb(String targetURL) {
    try {
      URL url = new URL(targetURL);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestMethod("GET");
      conn.setRequestProperty("Accept", "application/json");
      if (conn.getResponseCode() != 200) {
        throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
      }
      BufferedReader br;
      if ("gzip".equalsIgnoreCase(conn.getContentEncoding())) {
        br = new BufferedReader(new InputStreamReader(
        (new GZIPInputStream(conn.getInputStream()))));
      } else {
        br = new BufferedReader(new InputStreamReader(
        (conn.getInputStream())));
      }
      // Retrieve data from server
      String output = null;
      final StringBuffer buffer = new StringBuffer(16384);
      while ((output = br.readLine()) != null) {
        buffer.append(output);
      }
      conn.disconnect();
      // Extract JSON from the JSONP envelope
      String jsonp = buffer.toString();
      String json = jsonp.substring(jsonp.indexOf("(") + 1, //this is the index of the callback envelope
      jsonp.lastIndexOf(")"));
      //System.out.println("Output from server");
      //System.out.println(json);
      return json;
    } catch (MalformedURLException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
  }
}

私は試した:

Gson gson = new Gson();
FlightInfo flightArray = gson.fromJson(yesterdayJSON, FlightInfo.class);

私のデータには多くのエントリがあるため、リストに解析する必要があると確信しています。

JSON のサンプル

"flights": [
  {
    "date": "2013-05-12",
    "scheduled_time": "23:30",
    "estimated_time": "23:09*",
    "airline": "TR",
    "flight_no": "TR2109",
    "airport": "BKK",
    "origin": "Bangkok (Suvarnabhumi)",
    "via": "",
    "terminal": "2",
    "belt": "35",
    "status": "Landed",
    "airline_name": "TIGER AIRWAYS",
    "airline_alias": "",
    "unixtime": "1368372600",
    "master_flight_no": "TR2109",
    "slave_flight_no": []
  }
]

そして私のFlightInfo.class

import java.sql.Time;
import java.util.Date;

public class FlightInfo {
  private Date date;
  private Time scheduled_time;
  private Time estimated_time;
  private String airline;
  private String flight_no;
  private String airport;
  private String origin;
  private String via;
  private String terminal;
  private String belt;
  private String status;
  private String airline_name;

  public Date getDate() {
    return date;
  }
  public void setDate(Date date) {
    this.date = date;
  }
  public Time getScheduled_time() {
    return scheduled_time;
  }
  public void setScheduled_time(Time scheduled_time) {
    this.scheduled_time = scheduled_time;
  }
  public Time getEstimated_time() {
    return estimated_time;
  }
  public void setEstimated_time(Time estimated_time) {
    this.estimated_time = estimated_time;
  }
  public String getAirline() {
    return airline;
  }
  public void setAirline(String airline) {
    this.airline = airline;
  }
  public String getFlight_no() {
    return flight_no;
  }
  public void setFlight_no(String flight_no) {
    this.flight_no = flight_no;
  }
  public String getAirport() {
    return airport;
  }
  public void setAirport(String airport) {
    this.airport = airport;
  }
  public String getOrigin() {
    return origin;
  }
  public void setOrigin(String origin) {
    this.origin = origin;
  }
  public String getVia() {
    return via;
  }
  public void setVia(String via) {
    this.via = via;
  }
  public String getTerminal() {
    return terminal;
  }
  public void setTerminal(String terminal) {
    this.terminal = terminal;
  }
  public String getBelt() {
    return belt;
  }
  public void setBelt(String belt) {
    this.belt = belt;
  }
  public String getStatus() {
    return status;
  }
  public void setStatus(String status) {
    this.status = status;
  }
  public String getAirline_name() {
    return airline_name;
  }
  public void setAirline_name(String airline_name) {
    this.airline_name = airline_name;
  }
  @Override
  public String toString() {
    return "FlightInfo [date=" + date + ", scheduled_time=" + scheduled_time +
      ", estimated_time=" + estimated_time +
      ", airline=" + airline +
      ", flight_no=" + flight_no +
      ", airport=" + airport +
      ", origin=" + origin +
      ", via=" + via +
      ", terminal=" + terminal +
      ", belt=" + belt +
      ", status=" + status +
      ", airline_name=" + airline_name +
      "]";
  }
}
4

2 に答える 2

1

Gson が list.getClass() を呼び出してそのクラス情報を取得するため、上記のコードは value を FlightInfo 型として解釈できませんが、このメソッドは生のクラス List.class を返します。これは、Gson がこれがただの List ではなく List < FlightInfo> 型のオブジェクトであることを知る方法がないことを意味します。

この問題は、ジェネリック型に正しいパラメーター化された型を指定することで解決できます。TypeToken クラスを使用してこれを行うことができます。

Type listType = new TypeToken<List<Bar>>() {}.getType();
gson.toJson(list, listType );
gson.fromJson(json, listType );

詳細については、 gson-user-guide を確認してください

于 2013-05-13T19:38:07.960 に答える