使用GSON解析JSON

问题描述:

这是我以前的问题的延续。获取JSON请求并将其转换为JSON后,我试图将结果解析为Java对象。使用GSON解析JSON

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

我假设你的JSON响应由{ }包围,否则就不是有效的JSON ...

也就是说,您需要另一个类来解析您的JSON响应,例如:

public class Response {  
    private List<FlightInfo> flights;   
    //getters & setters 
} 

现在你可以分析你的回应:

Gson gson = new Gson(); 
Response response = gson.fromJson(yesterdayJSON, Response .class); 
List<FlightInfo> flightArray = response.getFlights(); 

:看你的FlightInfo类和你的JSON响应,我想你会遇到麻烦解析您DateTime领域,所以我建议您将它们解析为字符串,然后进行正确的转换......否则您必须创建一个custom deserializer

+0

嗨啊,我刚打的错误,当我试图解析..谢谢。 – jonleech 2013-05-14 01:05:47

上述代码无法将值解释为类型FlightInfo,因为Gson调用list.getClass()以获取其类信息,但此方法返回一个原始类List.class。这意味着Gson无法知道这是类型为列表< FlightInfo>的对象,而不仅仅是普通列表。

您可以通过为您的泛型指定正确的参数化类型来解决此问题。您可以通过使用TypeToken类来完成此操作。

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

的更多信息,请gson-user-guide