GSON在Android

时间:2015-08-19 03:24:38

标签: java android json gson

我用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>>

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

2 个答案:

答案 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类的超类。

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