创建动态类型列表

时间:2014-02-19 23:27:50

标签: java android json list gson

所以,我现在正在努力弄清楚如何解析大量不同的JSON对象,而不必硬编码函数来序列化和反序列化每个对象。我开始使用Gson,这一直很好用。当我尝试使用对象列表时,问题就开始出现了。

我想创建一个函数,它可以处理我可以传递JSONArray的任何数据模型对象和JSON包含的类类型,这样我就可以看到类似这样的调用 -

response = JSONHelper.createObjectList(jsonArray, DataObject.class);

顺便说一句,我不是从我的开发机器发帖,所以如果我的代码中有一些拼写错误,请原谅我。

我尝试通过写这样的东西来创建这种效果(在我的JSONHelper类中) -

public List createObjectList(JSONArray jsonArray, Class type) {
    Gson gson = new Gson();

    Type listType = new TypeToken<List<type>>() {}.getType();

    List<type> data = gson.fromJson(jsonArray, listType);

    return data;
}

好吧,显然这不是代码工作,但这有点像我希望能够让它工作。我尝试了几种不同的方式和变化,但我无法弄清楚任何有效的方法。

我是Android / Java世界的新手,所以我仍在学习该语言的内外版本。如果有人能给我一些关于如何实现我想要的东西的提示,那将会非常有帮助。感谢。

1 个答案:

答案 0 :(得分:2)

答案是:由于类型擦除,你无法在Java中做你想做的事情。

这是原因你必须使用TypeToken并将Type传递给Gson的fromJson()方法; T的类型信息在运行时不可用。 Java中的泛型大部分只是编译时类型检查。

理想情况下,您希望能够这样做:

public <T> List<T> createList(JsonArray a, Class<T> clazz)
{
    Type t = new TypeToken<List<T>>(){}.getType();
    return new Gson().fromJson(a, t);
}

但你不能,因为T被抹去了。如果你试试这个,你会发现结果完全混乱;你得到一个List,但实际不包含你的类并抛出一个强制转换异常。

实际上,您的方法必须如下所示:

public <T> List<T> createList(JsonArray a, Type t)
{
    List<T> list = new Gson().fromJson(a, t);
    return list;
}

当然,当你正在调用你编写的方法而不是仅仅在Gson中调用方法时,这当然会很愚蠢。

编辑以添加:

考虑到这一点,List类型的解决方法。您可以使用数组:

public <T> List<T> createList(JsonArray a, Class<T[]> c)
{
    T[] array = new Gson().fromJson(a, c);
    return Arrays.asList(array);
}

因为你不是试图依赖里面的 List中的泛型类型而是传递类的数组类型......它可以工作。有点乱,但它有效:

List<MyPojo> list = createList(a, MyPojo[].class);