【问题标题】:Unable to parse Json array using Gson无法使用 Gson 解析 Json 数组
【发布时间】:2013-07-15 09:02:52
【问题描述】:

我有这个 json 数组:

 [
{
"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
}
]

我有这个类来保存数据:

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;
    }

}   

我正在尝试将 json 转换为 MapData 对象列表:

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

但我得到这个错误:

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

我做错了什么?

【问题讨论】:

  • 类型擦除。 Gson 知道他必须反序列化 java.util.List,但不知道应该放入什么对象,所以他使用内部类型。
  • @ŁukaszLech - 但我告诉它它是一个 List 并且根据 Gson 文档这就是这样做的方法?!
  • 您的方法返回MapData 还是List&lt;MapData&gt;?我怀疑你可能返回了错误的类型。
  • @KevinBowersox - 你说得有道理,它实际上是一个通用方法(在这个例子中被简化了),我传入一个对象类型,而不是一个列表类型
  • @ftom2 查看我刚刚发布的答案。它包含一个带有工作示例的 GIST。我确实去掉了不同的字符集,但我认为这不会导致问题。

标签: java android json gson


【解决方案1】:

我怀疑调用fromJson 的方法返回了错误的类型。它应该返回 List&lt;MapData&gt; 而不是 MapData

类似:

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);     
}

我在Gist 中有一个关于您的问题的完整示例

【讨论】:

  • 谢谢,我会检查它,如果它有效,我会将其标记为正确答案
  • 找了2天,终于找到了正确的解决方法。非常感谢凯文!
【解决方案2】:
string Json="some Json String";
JavaScriptSerializer Js = new  JavaScriptSerializer();
MapData ObjMapDat = new MapData ();
ObjMapDat =Js.Deserialize<MapData>(Json);

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 2021-08-23
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多