Java GSON在Android中反序列化包含两种不同类型对象的列表

Java GSON在Android中反序列化包含两种不同类型对象的列表,java,android,json,gson,Java,Android,Json,Gson,我正在用gson保存我的列表,当我阅读它时,我遇到了问题。问题是我发送的列表有两种不同类型的对象。一个是CourseHeader,另一个是CourseInfo。以下是我现在掌握的代码: Type type = new TypeToken<List>(){}.getType(); List OLDcoursesArrayList = gson.fromJson(courseDataString, type); Type Type=new-TypeToken(){}.g

我正在用gson保存我的列表,当我阅读它时,我遇到了问题。问题是我发送的列表有两种不同类型的对象。一个是CourseHeader,另一个是CourseInfo。以下是我现在掌握的代码:

Type type = new TypeToken<List>(){}.getType();
        List OLDcoursesArrayList = gson.fromJson(courseDataString, type);
Type Type=new-TypeToken(){}.getType();
列出OLDcoursesArrayList=gson.fromJson(courseDataString,类型);
在这篇文章中:TypeToken我可以这样做:

TypeToken<List<CourseHeader>>
TypeToken<List<CourseHeader, CourseInfo>>
TypeToken
但是由于列表中有两个不同的对象,所以当我使用它们时,只有CourseHeader对象才起作用。我想知道我是否可以这样做:

TypeToken<List<CourseHeader>>
TypeToken<List<CourseHeader, CourseInfo>>
TypeToken

或者,如果我可以通过其他方式检索列表,以获取列表中的两个不同对象。

我认为您必须创建一个CourseObject对象列表,这两个对象都是CourseHeader和CourseInfo类的超类


在解析代码中,您可以对接收到的对象使用内省,以查看在将其保存到列表中之前需要将其实例化为哪些对象。

我认为您必须创建CourseObject对象的列表,这两个对象都是CourseHeader和CourseInfo类的超类


在解析代码中,您可以对接收到的对象使用内省,以查看在将其保存到列表中之前需要将其实例化为哪些对象。

我认为您必须创建CourseObject对象的列表,这两个对象都是CourseHeader和CourseInfo类的超类


在解析代码中,您可以对接收到的对象使用内省,以查看在将其保存到列表中之前需要将其实例化为哪些对象。

我认为您必须创建CourseObject对象的列表,这两个对象都是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。此阵列将如下所示:

TypeToken<List<CourseHeader>>
TypeToken<List<CourseHeader, CourseInfo>>
[{“header”:“item”,“topSeperator”:0},{“notheader”:“item”,“topSeperator”:0}]

之后,我创建了没有特定类型的列表对象

然后我使用for循环,它使用JsonElement迭代器在Json数组中循环,并将每个元素转换为字符串。我使用字符串检查它是否包含,例如“header”,如果包含,则使用

List.add(gson.fromJson(json, OBJECTTYPE.class)
所以你可以做的是,你可以在你的对象里面有一个变量,它指示它们是什么类型的对象。一个变量,如:

String objectType = "OBJECTTYPE";
然后,当您将Json数组中的每个元素转换为字符串时,检查字符串是否包含“OBJECTTYPE”,如果包含,则使用.add(gson.fromJson(Json迭代器,object.class的类型)像往常一样添加对象


这是一个黑客解决方案,但如果您有一个包含两种不同数据类型的列表,它就会起作用。我相信有更好的解决方案。

对于可能遇到此问题的任何其他人(解析可能包含两种不同数据类型对象的列表),我得到了一个黑客解决方案:

 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。该数组如下所示:

TypeToken<List<CourseHeader>>
TypeToken<List<CourseHeader, CourseInfo>>
[{“header”:“item”,“topSeperator”:0},{“notheader”:“item”,“topSeperator”:0}]

之后,我创建了没有特定类型的列表对象

然后我使用for循环,该循环使用JsonElement迭代器在Json数组中循环,并将每个元素转换为字符串

List.add(gson.fromJson(json, OBJECTTYPE.class)
所以你可以做的是,你可以在你的对象里面有一个变量,它指示它们是什么类型的对象

String objectType = "OBJECTTYPE";
然后,当您将Json数组中的每个元素转换为字符串时,检查字符串是否包含“OBJECTTYPE”,如果包含,则使用.add(gson.fromJson(Json迭代器,object.class的类型)像往常一样添加对象


这是一个黑客解决方案,但如果您有一个包含两种不同数据类型的列表,它就会起作用。我相信有更好的解决方案。

对于可能遇到此问题的任何其他人(解析可能包含两种不同数据类型对象的列表),我得到了一个黑客解决方案:

 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。该数组如下所示:

TypeToken<List<CourseHeader>>
TypeToken<List<CourseHeader, CourseInfo>>
[{“header”:“item”,“topSeperator”:0},{“notheader”:“item”,“topSeperator”:0}]

之后,我创建了没有特定类型的列表对象

然后我使用for循环,该循环使用JsonElement迭代器在Json数组中循环,并将每个元素转换为字符串

List.add(gson.fromJson(json, OBJECTTYPE.class)
所以你可以做的是,你可以在你的对象里面有一个变量,它指示它们是什么类型的对象

String objectType = "OBJECTTYPE";
然后,当您将Json数组中的每个元素转换为字符串时,检查字符串是否包含“OBJECTTYPE”,如果包含,则使用.add(gson.fromJson(Json迭代器,object.class的类型)像往常一样添加对象

这是一个骇人的解决方案,但如果您有一个包含两种不同数据类型的列表,它就可以工作