java-使用Gson将Json解析为具有通用字段的项目列表

public class OwnCollection<T>{
    private int size;
    private List<ResponseItem<T>> data;
}

public class ResponseItem<T>{
    private String path;
    private String key;
    private T value;
}

public class Query{
    public <T> OwnCollection<T>  getParsedCollection( ... ){
        String json = ...; //some unimportant calls where I get an valid Json to parse
        return Result.<T>parseToGenericCollection(json);
    }
}

public class Result{
    public static <T> OwnCollection<T> parseToGenericCollection(String result){
        Type type = new TypeToken<OwnCollection<T>>() {}.getType();
        //GsonUtil is a class where I get an Instance Gson, nothing more.
        return GsonUtil.getInstance().fromJson(result, type);
    }
}

现在我怎么称呼它:

OwnCollection<Game> gc = new Query().<Game>getParsedCollection( ... );

结果,我认为我将获得一个带有List< ResponseItem>的OwnCollection.其中一个Response Item包含Game类的一个字段. Json非常好,没有解析错误,现在唯一的问题是当我尝试获取一个Game项目并调用一个方法时出现此错误:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to at.da.example.Game

解决方法:

这样行不通,因为以下代码

OwnCollection<Game> gc = new Query().<Game>getParsedCollection( ... );

实际上没有在getParsedCollection()中传递Game. &LT游戏和GT;这里仅告诉编译器getParsedCollection()应该返回OwnCollection< Game&gt ;,但getParsedCollection()(和parseToGenericCollection())中的T仍然被擦除,因此TypeToken无法帮助您捕获其值. 您需要改为传递Game.class作为参数

public <T> OwnCollection<T> getParsedCollection(Class<T> elementType) { ... }
...
OwnCollection<Game> gc = new Query().getParsedCollection(Game.class);

然后使用TypeToken将OwnCollection的T与elementType链接起来,如下所示:

Type type = new TypeToken<OwnCollection<T>>() {}
    .where(new TypeParameter<T>() {}, elementType)
    .getType();

请注意,此代码使用TypeToken from Guava,因为Gson的TypeToken不支持此功能.

上一篇:java – 尝试在json中解析日期/时间时出现com.google.gson.JsonSyntaxException


下一篇:java – 使用GSON将POJO序列化为不同名称的JSON?