[英]GSON deserialize a list with two different types of objects in Android
我正在用gson保存列表,当我阅读它时,遇到了问题。 问题是我要发送的列表具有两种不同类型的对象。 一个是CourseHeader,另一个是CourseInfo。 这是我现在拥有的代码:
Type type = new TypeToken<List>(){}.getType();
List OLDcoursesArrayList = gson.fromJson(courseDataString, type);
在这段代码中: TypeToken <List>我可以做这样的事情:
TypeToken<List<CourseHeader>>
但是由于列表中有两个不同的对象,所以当我使用它们时,只有CourseHeader可以工作。 我想知道我是否可以做这样的事情:
TypeToken<List<CourseHeader, CourseInfo>>
或者,如果我可以通过其他方式检索列表,以在列表中获得两个不同的对象。
对可能遇到此问题的其他任何人(解析一个可能具有两种不同数据类型的对象的列表),那么我得到了一些棘手的解决方案:
Gson gson = new Gson();
String courseDataString = courseData.getString("courseList", "");
JsonArray courseDataArray = new JsonParser().parse(courseDataString).getAsJsonArray();
List NEWcoursesArrayList = new ArrayList();
for(JsonElement json : array){
if(json.toString().contains("header")) {
NEWcoursesArrayList.add(gson.fromJson(json, CourseHeader.class));
}
else{
NEWcoursesArrayList.add(gson.fromJson(json, CourseInfo.class));
}
}
因此,我们要做的是像往常一样获取Json字符串并将其转换为JsonArray。 因此,我们使用JsonParser解析字符串,然后调用“ getAsJsonArray”以获取JsonArray。 该数组如下所示:
[{“ header”:“ item”,“ topSeperator”:0},{“ notheader”:“ item”,“ topSeperator”:0}]
之后,我创建没有特定类型的List对象。
然后,我使用一个for循环,该循环使用JsonElement迭代器遍历Json数组,并将每个元素转换为字符串。 我使用字符串检查是否包含例如“ header”之类的字词,如果包含,则使用
List.add(gson.fromJson(json, OBJECTTYPE.class)
因此,您可以做的是,在对象内部可以有一个变量,用于指示它们是什么类型的对象。 像这样的变量:
String objectType = "OBJECTTYPE";
然后,当您将Json数组内的每个元素转换为字符串时,检查字符串是否包含“ OBJECTTYPE”,如果包含,则像往常一样使用.add(gson.fromJson(json迭代器,类型为object.class)。
这是一个骇人听闻的解决方案,但是如果您具有两个不同数据类型的列表,则可以使用它。 我确定有更好的解决方案。
我认为您必须创建一个CourseObject对象的列表,这两个对象都是CourseHeader和CourseInfo类的超类。
在解析代码中,您可以对接收到的对象进行自省,以查看将其保存到列表之前需要实例化的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.