2013-07-15 12 views
8

mam tej tablicy json:Nie można analizować JSON tablicę używając Gson

[ 
{ 
"id":18, 
"city":"הרצליה", 
"street":"החושלים 1", 
"zipcode":121209, 
"state":"IL", 
"lat":32.158138, 
"lng":34.807838 
}, 
{ 
"id":19, 
"city":"הרצליה", 
"street":"אבא אבן 1", 
"zipcode":76812, 
"state":"IL", 
"lat":32.161041, 
"lng":34.810410 
} 
] 

i mam tej klasy do przechowywania danych:

public class MapData { 
    private int id; 
    private String city; 
    private String street; 
    private String state; 
    private int zipcode; 
    private double lat; 
    private double lng; 

    public MapData(int id, String city, String street, String state, 
      int zipcode, double lat, double lng) {   
     this.id = id; 
     this.city = city; 
     this.street = street; 
     this.state = state; 
     this.zipcode = zipcode; 
     this.lat = lat; 
     this.lng = lng; 
    } 

    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 
    public String getStreet() { 
     return street; 
    } 
    public void setStreet(String street) { 
     this.street = street; 
    } 
    public String getState() { 
     return state; 
    } 
    public void setState(String state) { 
     this.state = state; 
    } 
    public int getZipcode() { 
     return zipcode; 
    } 
    public void setZipcode(int zipcode) { 
     this.zipcode = zipcode; 
    } 
    public double getLat() { 
     return lat; 
    } 
    public void setLat(double lat) { 
     this.lat = lat; 
    } 
    public double getLng() { 
     return lng; 
    } 
    public void setLng(double lng) { 
     this.lng = lng; 
    } 

} 

Próbuję przekonwertować json do Lista rzecz firmy MapData obiektów:

Type type = new TypeToken<List<MapData>>(){}.getType(); 
return gson.fromJson(jsonString, type); 

ale pojawia się ten błąd:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.deliveries.models.MapData 

Co robię źle?

+2

Rodzaj skasowaniem. Gson wie, że musi deserializować java.util.List, ale nie ma pojęcia, jakie obiekty powinien w nim umieścić, więc używa wewnętrznych typów. –

+0

@ ŁukaszLech - ale powiedziałem, że jest to lista i według dokumentów Gsona to sposób na zrobienie tego ?! – Tomer

+0

Czy twoja metoda zwraca 'MapData' lub' List '? Podejrzewam, że możesz zwrócić niewłaściwy typ. –

Odpowiedz

31

Podejrzewam, że metoda wywołująca fromJson zwraca nieprawidłowy typ. Powinien zwrócić wartość List<MapData> zamiast MapData.

Coś jak:

public static List<MapData> getData(){ 
    Gson gson = new Gson(); 
    String jsonString = "[{\"id\":18,\"city\":\"test\",\"street\":\"test 1\",\"zipcode\":121209,\"state\":\"IL\",\"lat\":32.158138,\"lng\":34.807838},{\"id\":19,\"city\":\"test\",\"street\":\"1\",\"zipcode\":76812,\"state\":\"IL\",\"lat\":32.161041,\"lng\":34.810410}]"; 
    Type type = new TypeToken<List<MapData>>(){}.getType(); 
    return gson.fromJson(jsonString, type);  
} 

Mam przykład w pełni działającą problemu w tym Gist

+0

Dzięki, sprawdzę i jeśli to zadziała, oznaczy to jako właściwą odpowiedź – Tomer

+0

Po wyszukaniu przez 2 dni, w końcu otrzymałem poprawne podejście do rozwiązania. Wielkie dzięki Kevin! – PsyGik

-1
string Json="some Json String"; 
JavaScriptSerializer Js = new JavaScriptSerializer(); 
MapData ObjMapDat = new MapData(); 
ObjMapDat =Js.Deserialize<MapData>(Json);