首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要操作返回的JSON对象并将一部分提取到列表中

需要操作返回的JSON对象并将一部分提取到列表中
EN

Stack Overflow用户
提问于 2020-07-10 11:11:24
回答 2查看 79关注 0票数 0

我正在使用一个外部API,它返回一个JSON对象。该对象响应中包含一个数组,我需要提取该数组并将其设置为特定实体类型的列表。然而,Java不是一种我非常熟悉的语言,所以我在尝试弄清楚这一点时遇到了问题。

我已经创建了一种包装器类来在setter中使用它。

我想出的最好的编译方法如下所示,但是产生了一个我不能确定的错误。

代码语言:javascript
复制
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来解决我遇到的一些类型问题。

执行时产生的错误为:

代码语言:javascript
复制
org.json.JSONException: Expected a ':' after a key at 7 [character 8 line 1]

返回字符串如下:Response String Image

如果这很难处理,下面是文本形式的响应:

代码语言:javascript
复制
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"}]}}

很可能有一种更简单的方法来完成我需要的东西。任何示例帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2020-07-10 12:49:33

您可以直接使用Gson string来对象映射器类,如下所示:

代码语言:javascript
复制
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());
    }
  }

}

对象映射类:在Flights.class中,您可以添加json response中的所有变量。

代码语言:javascript
复制
 class FlightInfoResultObject {

  FlightInfoResult FlightInfoResult;
  @Getter
  @Setter
 }

class FlightInfoResult {

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

class Flights {
  String ident;
  String aircrafttype;
  @Getter
  @Setter
}
票数 0
EN

Stack Overflow用户

发布于 2020-07-10 14:46:35

我认为直接使用gson检索内部JSON元素是不可能的。相应地,您必须先获取FlightInfoResult,然后再获取flights。这应该是可行的:

代码语言:javascript
复制
    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类应该如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62826776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档