当找不到正确的对象时,GSON从JSON错误

时间:2015-02-13 11:57:23

标签: java json gson

我有一个JSON字符串并使用GSON来创建它的对象。 但是,似乎有一个错误,因为gson不知道List应该是一个乘客列表。但我似乎无法使其发挥作用。 我必须告诉GSON它应该检索包含乘客的Walkin。

 public static void main(String[] args) {
    String json = "{'price':278,'id':1459465,'passengers':[{'type':'student','price':99},{'type':'student','price':179}]}";
    Gson gson = new Gson();
    WalkIn walkinRequest = gson.fromJson(json, WalkIn.class);
    //I have also tried WalkIn walkinRequest = gson.fromJson(json, new TypeToken<WalkIn>(){}.getType());

    System.out.println("price: " + walkinRequest.price); 
    System.out.println("id: " + walkinRequest.id);
    Passenger p = (Passenger) walkinRequest.passengers.get(0); //Error
    PassengerOne p1 = (PassengerOne) p;
    System.out.println("Passenger - Type: " + p1.type + " price: " + p1.price);
 }

static class WalkIn {
    int price;
    int id;
    List passengers;
}

static interface Passenger {
    public List getContent();
}

static class PassengerOne implements Passenger{
    String type;
    int price;

    public List getContent() {
        List list = new ArrayList();
        list.add(type);
        list.add(price);
        return list;
    }   
}

static class PassengerTwo implements Passenger{
    String name;
    int age;

    public List getContent() {
        List list = new ArrayList();
        list.add(name);
        list.add(age);
        return list;
    }   
}

输出结果为:

 price: 278
 id: 1459465
 Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to testpack.GsonJson$Passenger
      at testpack.GsonJson.main(GsonJson.java:35)

我不能把

 List<Passenger> 

在Walkin中而不是List,因为我在Walkin中使用不同类型的Passenger对象。取决于我想要使用的内容。

1 个答案:

答案 0 :(得分:0)

只需使用&#39; Passenger&#39; class为Gson数组而不是List,请参阅下面的

import com.google.gson.annotations.SerializedName;

static class WalkIn {
    @SerializedName("price")
    int price;
    @SerializedName("id")
    int id;
    @SerializedName("passengers")
    Passenger[] passenger_list ;
}

static class Passenger {
    @SerializedName("type")
    String type;
    @SerializedName("price")
    int price;

}