2015-02-13 3 views
0

У меня есть JSON-строка и используйте GSON для создания ее объектов. Однако, похоже, ошибка, потому что gson не знает, что List должен быть списком Пассажиров. Но я не могу заставить его работать. Я должен сказать GSON, что он должен получить Walkin, содержащий пассажиров.GSON от ошибки JSON, когда не найден правильный объект

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 вместо списка, потому что я использую различные типы объектов в пассажирских Walkin. В зависимости от того, что я хочу использовать.

+0

никогда не использовал GSON, но, возможно, 'Список passengers' или' Пассажирские [] passengers' в 'WalkIn'? См. Http://stackoverflow.com/questions/5554217/google-gson-deserialize-listclass-object-generic-type – NiziL

+0

Да, он будет работать, если я верну List внутри JSON вместо простого списка. Но метод используется для разных типов пассажирских объектов ... например, PassengerOne {int price, String type} и PassengerTwo {String Name, int price} и т. Д. Таким образом, WalkIn должен содержать список. Позже он преобразуется – TorK

+0

, преобразованный в PassengerOne p = walkInRequest.passengers.get (0). В другое время PassengerTwo передается в JSON. – TorK

ответ

0

Просто используйте '' Пассажирский класс как Gson массива вместо списка, смотрите ниже

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; 

} 
+0

да, он будет работать, если я поместил List внутри WalkIn.class а не просто List. Но метод используется для разных типов пассажирских объектов ... например, PassengerOne {int price, String type} и PassengerTwo {String Name, int price} и т. Д. Таким образом, WalkIn должен содержать список. Позже это – TorK

+0

Я отредактировал свой ответ, пожалуйста, обратитесь и я обещаю, что это работает на 100%. –

+0

преобразован в PassengerOne p = walkInRequest.passengers.get (0). В другое время PassengerTwo передается в JSON. – TorK

Смежные вопросы