Gson没有反序列化JSON数据

时间:2015-06-11 07:48:28

标签: java json serialization gson

我正在尝试从Yahoo API获取一些天气信息。这是我的JSON:

JSON

这是我的DTO:

jQuery(window).load(function () {
    jQuery('#load').show();
    jQuery.ajax({
        url: "<?php echo get_stylesheet_directory_uri(); ?>/ajax/sales.php",
        type: "get",
        success: function (e) {
            document.getElementById("tab-1").innerHTML = e;
            jQuery('#load').hide();
        },
        error: function (e, t) {
            e.status > 0 && (document.getElementById("tab-1").innerHTML = "Error: " + t);
        }
    })
});

jQuery("#tb-1").click(function () {
    jQuery('#load').show();
    jQuery.ajax({
        url: "<?php echo get_stylesheet_directory_uri(); ?>/ajax/sales.php",
        type: "get",
        success: function (e) {
            document.getElementById("tab-1").innerHTML = e;
            jQuery('#load').hide();
        },
        error: function (e, t) {
            e.status > 0 && (document.getElementById("tab-1").innerHTML = "Error: " + t);
        }
    })
});

我只对public class forecast implements Serializable { private static final long serialVersionUID = -520652416977871134L; private String text; private String high; private String day; private String code; private String low; private String date; public forecast() { } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getHigh() { return high; } public void setHigh(String high) { this.high = high; } public String getDay() { return day; } public void setDay(String day) { this.day = day; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getLow() { return low; } public void setLow(String low) { this.low = low; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } @Override public String toString() { return "ClassPojo [text = " + text + ", high = " + high + ", day = " + day + ", code = " + code + ", low = " + low + ", date = " + date + "]"; } } 元素感兴趣。

当我尝试将反序列化的数据读入我的DTO时,所有这些数据都为空。我觉得我没有正确地格式化我的DTO。

此外,将JSON映射到POJO的正确方法是什么?

编辑:这是我的反序列化代码

forecast

1 个答案:

答案 0 :(得分:1)

你的JSON(你从雅虎那里获得)非常复杂。所以它不能轻易映射到简单的POJO(但你仍然可以编写包含所有相应嵌套JSON元素的字段的巨大POJO)。

但是可以从JSON中解析和提取特定元素。

代码:

public static void main(String[] args) {
    String endpoint = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20"
            + "where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22Rhodes%2C%20Gr%22)&"
            + "format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
    try {
        URL endpointURL = new URL(endpoint);
        HttpURLConnection connection = (HttpURLConnection) endpointURL
                .openConnection();
        connection.connect();
        InputStream input = connection.getInputStream();
        JsonReader reader = new JsonReader(new InputStreamReader(input));
        reader.setLenient(true);

        JsonElement forecastSubObject = new JsonParser().parse(reader).
                getAsJsonObject().get("query").
                getAsJsonObject().get("results").
                getAsJsonObject().get("channel").
                getAsJsonObject().get("item").
                getAsJsonObject().get("forecast");  

        System.out.println(forecastSubObject.toString());   

        List<forecast> forecasts = (List<forecast>)new Gson().fromJson(forecastSubObject, List.class);

        System.out.println("forecast : " + forecasts);
        System.out.println("first forecast: " + forecasts.get(0));      
    } catch (IOException e) {
        e.printStackTrace();
    }
}

使用JsonParser,您可以浏览元素(按照他们的名字)。当预测&#39;到达元素对应的字符串被提取。然后它作为常规对象进行解析并映射到预测POJO的列表。

一般来说,与JSON之间的映射是非常广泛的。不同的库提供了不同的方法来实现这一目标(从简单,肮脏到复杂但可靠)。