使用GSON将JSON嵌套对象解析为Java POJO

时间:2018-09-07 14:11:32

标签: java json gson

我想用Gson将带有嵌套数组的JSON字符串解析为POJO,但似乎不起作用。

我的JSON字符串如下:

{
   "magdeburg":{
      "average":"21.40",
      "maximum":"22.33",
      "minimum":"19.06"
   },
   "frankfurt":{
      "average":"16.41",
      "maximum":"16.57",
      "minimum":"16.09"
   }
}

我的POJO类如下:

public class PingResult {

    public double average;
    public double maximum;
    public double minimum;

    public PingResult(double average, double maximum, double minimum) {
        this.average= average;
        this.maximum =  maximum;
        this.minimum= minimum;
    }

    public String toString() {
        return "average:" + this.average + ",maximum:"+this.maximum+",minimum:"+this.minimum;
    }
}

但是当我想使用以下代码将其解析为POJO时:

List<PingResult> pr =  (List<PingResult>) gson.fromJson(q, PingResult.class);
        for(PingResult p:pr) {
            System.out.println(p.toString());
        }

给出了

的错误
  

java.lang.ClassCastException:无法将PingResult强制转换为   java.util.List位于   DelayBasedMeasurement.main(DelayBasedMeasurement.java:380)。

我尝试解析为PingResult [],但仍然无法正常工作。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

首先,gson.fromJson(q, PingResult.class)不会返回列表,而只会返回单个对象。您需要使用TypeToken

第二,您没有JSON对象的列表,但有一个映射。没有[]字符,并且每个ping结果都是城市字符串键的值。

尝试使用TreeMap<String, PingResult>作为反序列化类型

Type pingType =  new TypeToken<TreeMap<String, PingResult>>(){}.getType();

TreeMap<String, PingResult> pingMap = gson.fromJson(json, pingType);

答案 1 :(得分:1)

不确定如何使用production来做到这一点,但这是如何使用List来做到这一点:

Map

如果您需要所有值,则只需Map<String, Ping> map = gson.fromJson(json, new TypeToken<Map<String, Ping>>(){}.getType());