使用传递的泛型进行GSON反序列化

4

我正在为JSON映射库编写一个简单的门面。对于我的默认实现,我使用GSON但遇到了一个问题。我定义了一个类似于这样的类:

    public class QueryResult<T> {

        private List<T> results;
        private String nextOffset;

        public List<T> getResults() { return results; }

        public void setResults(List<T> results) { this.results = results; }

        public String getNextOffset() { return nextOffset; }

        public void setNextOffset(String nextOffset) { this.nextOffset = nextOffset; }
    }

我希望您能够使用它来做类似于这样的事情:
    public <T> QueryResult<T> fromJsonQuery(String string, Class<T> clazz) {
        Type type = new TypeToken<QueryResult<T>>() {}.getType();
        return gson.fromJson(string, type);
    }

然而,每当我调用这个方法时,就会出现错误:
    QueryResult<Foo> qr = mapper.fromJsonQuery(json, Foo.class);
    for (Foo foo : qr.getResults()) {
        System.out.println(foo.toString());
    }

    java.lang.ClassCastException: com.google.gson.internal.StringMap cannot be cast to example.Foo

任何帮助都将不胜感激。谢谢。
1个回答

1
我想到了一个对我有效的解决方案。基本上,我定义了继承QueryResult的内部类来满足我需要的各种类型。在我的门面中,我定义了这个方法:
    public <T> T fromJson(String string, Class<T> clazz) {
        return gson.fromJson(string, clazz);
    }

然后我可以执行以下操作,它可以正常工作:

    public class Main {

        class FooQuery extends QueryResult<Foo> {}

        public static void main(String[] args) {
            Mapper mapper = new GsonMapper();
            String json = args[0];

            QueryResult<Foo> qr = mapper.fromJson(json, FooQuery.class);

            for (Foo foo : qr.getResults()) {
                System.out.println(foo.toString());
            }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接