java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换为模型

时间:2016-07-26 00:47:22

标签: java json gson deserialization

在查看Stackoverflow问题后,我找不到任何可以解决此问题的解决方案。

我正在尝试使用GSON并实现了这样的通用方法:

public <T> List<T> deserializeList(String json) {
    Gson gson = new Gson();
    Type type = (new TypeToken<List<T>>() {}).getType();
    return  gson.fromJson(json, type);
}

通过以下方式调用此方法:

parser.<Quote>deserializeList(result)

然而,我得到的结果是:

enter image description here

当我尝试访问某个对象时,我收到此错误:

 java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to model.Quote

JSON字符串是:

[
    {
      "id": 269861,
      "quote": "People living deeply have no fear of death.",
      "author": "Anais Nin",
      "genre": "life",
      "tag": null,
      "createdAt": "2016-04-16T13:13:36.928Z",
      "updatedAt": "2016-04-16T13:13:36.928Z"
    }
]

3 个答案:

答案 0 :(得分:1)

我认为您可以编写这样的方法来明确提供Type

public <T> List<T> deserializeList(String json, Type type) {
    Gson gson = new Gson();
    return  gson.fromJson(json, type);
}

尽管如此,绕过(new TypeToken<List<Model>>() {}).getType();看起来有点乱。

我对类型擦除不太熟悉,但我打赌这与问题有关。

答案 1 :(得分:1)

上述解析方法有误,并修改了以下代码:

public static <T> List<T> getObjectList(String jsonString,Class<T> cls){
    List<T> list = new ArrayList<T>();
    try {
        Gson gson = new Gson();
        JsonArray arry = new JsonParser().parse(jsonString).getAsJsonArray();
        for (JsonElement jsonElement : arry) {
            list.add(gson.fromJson(jsonElement, cls));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

答案 2 :(得分:1)

在Kotlin中,您可以定义一个标准化的扩展函数,例如:

internal inline fun <reified T> Gson.fromJson(json: String) =
    fromJson<T>(json, object : TypeToken<T>() {}.type)

然后像这样使用它:

val resultJson = "{...}"
val quotesList: List<Quote> = gson.fromJson(resultJson)

说明::在运行时,所有通用类型都将被擦除(编译器可以创建完全正确的代码,而无需在运行时保留通用类型)。但是,如果将类型声明为reified,则可以在运行时在函数中使用该类型。