所以,我现在正在努力弄清楚如何解析大量不同的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世界的新手,所以我仍在学习该语言的内外版本。如果有人能给我一些关于如何实现我想要的东西的提示,那将会非常有帮助。感谢。
答案 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);