2014-02-19 127 views
0

因此,我正在努力弄清楚如何解析大量不同的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世界,所以我仍然在学习语言的输入和输出。如果有人可以给我一些关于如何实现我所期望的技巧,这将会非常有帮助。谢谢。

回答

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); 
} 

但是你不能,因为ŧ被擦除。如果你尝试这个,你会发现结果令人困惑;你得到一个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);