繁体   English   中英

GSON在Android中使用两种不同类型的对象反序列化列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM