數(shù)組類型不同解析問題探究

我們在開發(fā)過程中可以遇到json 數(shù)組中的具體的javaBean 不一致現(xiàn)象。例如:

{"list":[{
    "type":a,
    "data":A,
},{
    "type":a,
    "data":B
}]}

如上圖所示懂诗,list中data的類型根據(jù)type的值而變化蜂嗽。像這種bean類型不一致問題,一直煩惱著開發(fā)者,現(xiàn)在簡單介紹下殃恒,幾種 可行的解決思路植旧。

方法一:合并Bean

如果A與B中的字段不復雜,可以將A离唐,B合并組合成一個比較大的Bean實例病附,他包括A和B中所有的字段。
例如:

{"list":[{
    "type":"person",
    "data":{
          name:"小王",
          age:15,
          gender:"male"
    },
},{
    "type":"dog",
    "data":{
          name:"旺財",
          age:2,
          species:"家狗"
    },
}]}

合并之后的bean 為:

public class combineBean {
    public String name;
    public int age;
    public String gender;
    public String species;
}

方法二:data字段根據(jù)type而更改

對于數(shù)組中data數(shù)據(jù)結構不同亥鬓,那么字段就不統(tǒng)一命名成data完沪,而是根據(jù)type的不同類型,服務器返回不同的字段,如:person覆积,dog听皿。那么對應的實體類應該是這樣的形式:

public class ListBean{
    public String type;
    public PersonBean person;
    public DogBean dog;
}

此方法前提條件就是需要服務器配合,要是你用現(xiàn)成的服務器那么這種方法完全就不用考慮了宽档。
另外這種方法data中類型種類比較多尉姨,還會導致ListBean類比較大。而且json中字段不統(tǒng)一吗冤。

方法三:Json解析

既然我們的data中的實體類又厉,根據(jù)type類型進行改變,我們可以首先解析出來type字段對應的值欣孤,然后根據(jù)type值得類型馋没,設置data不同的類型的實體類,然后再解析data中數(shù)據(jù)降传。
當然關于ListBean中類型統(tǒng)一,可以設置data類型的接口勾怒,或者父類婆排,然后子類實現(xiàn)它:
list中data字段對應的基類,

public class DataBean{}

當然你可以將data中子類中相同的字段提取出來笔链,放在DataBean中段只。
有了DataBean這個虛擬的基類后,我們就可以統(tǒng)一ListBean的類型鉴扫。
ListBean

public class ListBean{
    public String type;
    public DataBean data;
}

然后讓data中具體的不同子類去繼承父類DataBean赞枕,實現(xiàn)我們需要的子類。

public class PersonBean extend DataBean{
    public String name;
    public int age;
    public String gender;
}
public class DogBean extend DataBean{
    public String name;
    public int age;
    public String species ;
}

我們可以安裝Json的解析的方法坪创,首先將返回的json字符串慢慢解析成實體類炕婶,首先解析list,然后里面的type 我們根據(jù)type的類型然后解析data中不同類型的數(shù)據(jù)莱预。
這個json解析唯一的難點就是必須首先要解析出type的數(shù)據(jù)柠掂,然后根據(jù)type才能確定data的不同的實體類型。

其實Gson中可以自定義解析器依沮;

public class ListBeanDeserializer implements JsonDeserializer<TypeResult> {

    @Override
    public ListBean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
         if (!json.isJsonObject()) {
            return null;
        }
        JsonObject obj = json.getAsJsonObject();
        JsonArray asJsonArray = obj.get("list").getAsJsonArray();
        ListBean list = new ListBean();
        for (JsonElement jsonElement : asJsonArray) {
            JsonObject jsonOb = jsonElement.getAsJsonObject();
            String type = jsonOb.get("type").getAsString();
            if (TextUtils.equal(type,"person")) {
                JsonObject child = jsonOb.get("data").getAsJsonObject();
                String name = child.get("name").getAsString();
                int age = child.get("age").getAsInt();
                String gender = child.get("gender").getAsString();
                list.data=new Person(name, age,gender);
            } else if(TextUtils.equal(type,"dog")) {
                JsonObject child = jsonOb.get("data").getAsJsonObject();
                String name = child.get("name").getAsString();
                int age = child.get("age").getAsInt();
                String species = child.get("species").getAsString();
                list.data=new Person(name, age,species);
            }
        }
        return list;
    }
}

使用解析器解析:

  protected ArrayList<ListBean> deserializerResponse(@NonNull Response response) throws IOException {
                        String json = null;
                        if (response != null && response.body() != null) {
                            json = response.body().string();
                        }
                        GsonBuilder gsonBuilder = new GsonBuilder();
                        gsonBuilder.registerTypeAdapter(ListBean.class, new ListBeanDeserializer());
                        Gson gson = gsonBuilder.create();
                        return gson.fromJson(TextUtils.isEmpty(json) ? json : json.trim(), new TypeToken<ArrayList<ListBean>>() {
                        }.getType());
                    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末涯贞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子危喉,更是在濱河造成了極大的恐慌宋渔,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜限,死亡現(xiàn)場離奇詭異皇拣,居然都是意外死亡,警方通過查閱死者的電腦和手機列粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門审磁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谈飒,“玉大人,你說我怎么就攤上這事态蒂『即耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵钾恢,是天一觀的道長手素。 經(jīng)常有香客問我,道長瘩蚪,這世上最難降的妖魔是什么泉懦? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮疹瘦,結果婚禮上崩哩,老公的妹妹穿的比我還像新娘。我一直安慰自己言沐,他們只是感情好邓嘹,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著险胰,像睡著了一般汹押。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上起便,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天棚贾,我揣著相機與錄音,去河邊找鬼榆综。 笑死妙痹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的奖年。 我是一名探鬼主播细诸,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陋守!你這毒婦竟也來了震贵?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤水评,失蹤者是張志新(化名)和其女友劉穎猩系,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體中燥,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡寇甸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拿霉。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吟秩,死狀恐怖,靈堂內的尸體忽然破棺而出绽淘,到底是詐尸還是另有隱情涵防,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布沪铭,位于F島的核電站壮池,受9級特大地震影響,放射性物質發(fā)生泄漏杀怠。R本人自食惡果不足惜椰憋,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赔退。 院中可真熱鬧橙依,春花似錦、人聲如沸离钝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卵渴。三九已至,卻和暖如春鲤竹,著一層夾襖步出監(jiān)牢的瞬間浪读,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工辛藻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碘橘,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓吱肌,卻偏偏與公主長得像痘拆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氮墨,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理纺蛆,服務發(fā)現(xiàn),斷路器规揪,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評論 6 342
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法浑度,繼承相關的語法雷厂,異常的語法,線程的語...
    子非魚_t_閱讀 31,664評論 18 399
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,786評論 0 15
  • 芝芝覺得明天的女同胞們可以去浪了欠雌,至于男同胞們蹄梢,就留在辦公室加班吧! “每個女人心中都住著一個女王” 女王必備守則...
    牛二寶閱讀 295評論 0 1