簡體   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