【问题标题】:Need to manipulate returned JSON Object and extract a portion to a List需要操作返回的 JSON 对象并将一部分提取到列表中
【发布时间】:2020-07-10 03:11:23
【问题描述】:

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

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

我想出的最好的编译如下,但会产生一个我无法弄清楚的错误。

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]

响应字符串如下: Response String Image

如果这很难处理,以下是文本回复:

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"}]}}

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

【问题讨论】:

  • 刚刚添加。对此感到抱歉。
  • flights 不是 JSON 对象的属性,它是 FlightInfoResult 属性的属性。你需要类似json.getJSONObject("FlightInfoResult").getJSONArray("flights")

标签: java json api


【解决方案1】:

您可以像下面这样直接使用 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
}

【讨论】:

    【解决方案2】:

    我认为直接使用 gson 检索内部 JSON 元素是不可能的。 你必须得到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
    

    【讨论】:

    • 这让我很接近! gson 操作没有产生错误,我的 Flight 实体已经映射到“flights”部分的属性。我仍然从我的服务 bean 中得到错误,所以我仍在使用它。我会告诉你。感谢您提供这个潜在的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多