繁体   English   中英

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

[英]Parsing Json to List of Items with generic field with Gson

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 ,其中一个响应项包含类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 <Game>这里只是告诉编译器getParsedCollection()应该返回OwnCollection<Game> ,但TgetParsedCollection()parseToGenericCollection()保持消除,因此TypeToken不能帮你捕捉到它的价值。

您需要将Game.class作为参数传递

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

然后使用TypeTokenOwnCollectionTelementType链接,如下所示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM