我用gson保存我的List,当我读它时,我遇到了问题。问题是我发送的List有两种不同类型的对象。一个是CourseHeader,另一个是CourseInfo。这是我现在的代码:
Type type = new TypeToken<List>(){}.getType();
List OLDcoursesArrayList = gson.fromJson(courseDataString, type);
在这篇文章中: TypeToken&lt;列表&gt; 我可以这样做:
TypeToken<List<CourseHeader>>
但由于列表中有两个不同的对象,因此只有CourseHeader才能使用它们。我想知道我是否可以这样做:
TypeToken<List<CourseHeader, CourseInfo>>
或者,如果我可以通过其他方式检索列表以获取列表中的两个不同对象。
答案 0 :(得分:2)
对于可能遇到此问题的任何其他人(解析可能有两种不同数据类型的对象的列表),我得到了一些hacky解决方案:
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。这个数组看起来像这样:
[{ “报头”: “项目”, “topSeperator”:0},{ “notheader”: “项目”, “topSeperator”:0}]
之后我创建了没有特定类型的List对象。
然后我使用for循环,它使用JsonElement迭代器循环遍历Json数组,并将每个元素转换为字符串。我使用字符串检查它是否包含例如“header”,如果是,那么我使用
将项目添加到我的列表中List.add(gson.fromJson(json, OBJECTTYPE.class)
所以你可以做的是,你可以在对象内部有一个变量来指示它们是什么类型的对象。变量如:
String objectType = "OBJECTTYPE";
然后当你将Json数组中的每个元素转换为字符串时,检查字符串是否包含“OBJECTTYPE”,如果是,则使用.add(gson.fromJson(json iterator, object.class的类型。
这是一个hacky解决方案,但是如果你有一个包含两种不同数据类型的List,它就可以工作。我确信有更好的解决方案。
答案 1 :(得分:0)
我认为您必须创建一个CourseObject对象列表,这两个对象都是CourseHeader和CourseInfo类的超类。
在解析代码中,您可以在收到的对象上使用内省,以便在将其保存到列表中之前查看需要将其实例化的内容。