項目需求討論-后臺返回的特殊JSON處理

在實際開發(fā)中藻雪,現(xiàn)在安卓端和后臺之間的數(shù)據(jù)交互饲宿,一般都是用JSON來傳遞數(shù)據(jù)信息。JSON大家一般都比較熟悉迈勋。我這邊就以實際項目中的后臺傳過來的情況和大家分析下及如何處理炬灭。

比如后臺返回一個交易查詢:

我們看到這個列表本身要按月份來進行分類。然后月份里面再是具體的一項項記錄靡菇。
這里我們分二種后臺傳給你的JSON格式情況講解下:(重點是第二種情況)

普通格式

一般來說后臺會根據(jù)這個需求傳遞相關JSON:
比如后臺一般這么發(fā)給你:

{
    "success": true,
    "msg": "用戶查詢訂單成功",
    "obj": [
        {
            "month": {
                "date": "09月",
                "list": [
                    {
                        "companyName": "寧波心科技有限公司",
                        "createDate": "2016.09.14 17:35:45",
                        "money": "5000",
                        "type": "2"
                    },
                    {
                        "companyName": "湖南省林森科技有限公司",
                        "createDate": "2016.09.10 17:35:45",
                        "money": "5900",
                        "type": "2"
                    }
                ]
            }
        },
        {
            "month": {
                "date": "11月",
                "list": [
                    {
                        "companyName": "杭州心科技有限公司",
                        "createDate": "2016.11.14 17:35:45",
                        "money": "-200",
                        "type": "1"
                    },
                    {
                        "companyName": "湖南省林森科技有限公司",
                        "createDate": "2016.11.10 17:35:45",
                        "money": "-5900",
                        "type": "1"
                    }
                ]
            }
        }
    ]
}

OK担败,這種情況很簡單。我們只要建立一個對象類镰官,然后通過網絡獲取到JSON的時候進行轉換,然后轉成我們的對象類即可吗货。

public class Bean {

    private boolean success;
    private String msg;
    private List<ObjBean> obj;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<ObjBean> getObj() {
        return obj;
    }

    public void setObj(List<ObjBean> obj) {
        this.obj = obj;
    }

    public static class ObjBean {
        /**
         * month : {"date":"09月","list":[{"companyName":"寧波心科技有限公司","createDate":"2016.09.14 17:35:45","money":"5000","type":"2"},{"companyName":"湖南省林森科技有限公司","createDate":"2016.09.10 17:35:45","money":"5900","type":"2"}]}
         */

        private MonthBean month;

        public MonthBean getMonth() {
            return month;
        }

        public void setMonth(MonthBean month) {
            this.month = month;
        }

        public static class MonthBean {
            /**
             * date : 09月
             * list : [{"companyName":"寧波心科技有限公司","createDate":"2016.09.14 17:35:45","money":"5000","type":"2"},{"companyName":"湖南省林森科技有限公司","createDate":"2016.09.10 17:35:45","money":"5900","type":"2"}]
             */

            private String date;
            private List<ListBean> list;

            public String getDate() {
                return date;
            }

            public void setDate(String date) {
                this.date = date;
            }

            public List<ListBean> getList() {
                return list;
            }

            public void setList(List<ListBean> list) {
                this.list = list;
            }

            public static class ListBean {
                /**
                 * companyName : 寧波心科技有限公司
                 * createDate : 2016.09.14 17:35:45
                 * money : 5000
                 * type : 2
                 */

                private String companyName;
                private String createDate;
                private String money;
                private String type;

                public String getCompanyName() {
                    return companyName;
                }

                public void setCompanyName(String companyName) {
                    this.companyName = companyName;
                }

                public String getCreateDate() {
                    return createDate;
                }

                public void setCreateDate(String createDate) {
                    this.createDate = createDate;
                }

                public String getMoney() {
                    return money;
                }

                public void setMoney(String money) {
                    this.money = money;
                }

                public String getType() {
                    return type;
                }

                public void setType(String type) {
                    this.type = type;
                }
            }
        }
    }
}

因為我是用Retrofit+Rxjava的泳唠。所以我們這邊就可以直接用

@GET("accountManage/getOrders.do")
    Observable<Bean> getDealQuery(
            @Query("companyCode")String companyCode,
            @Query("orderID")int orderID,
            @Query("status")int status);

這樣我們的JSON就自動轉換成了Bean對象,然后我們就對B對象進行相關操作即可宙搬。十分方便笨腥。比如獲取里面的內容拓哺,我們就bean.isSuccess()等。

這里生成的對象類我們用的是Android Studio的插件<GsonFormat>就可以生成脖母。把我們上面的JSON字符串輸入士鸥,它就能識別,幫忙生成相應的對象類谆级。十分方便烤礁。
鏈接:插件GsonFormat快速實現(xiàn)JavaBean


特殊格式

還是剛那個需求,可能后臺不是那么友好肥照,為了自己方便脚仔,少幾個字段,可能傳給你是這樣的JSON格式:

{
    "success": true,
    "msg": "用戶查詢訂單成功",
    "obj": {
        "09月": [
            {
                "companyName": "寧波心科技有限公司",
                "createDate": "2016.09.14 17:35:45",
                "money": "5000",
                "type": "2"
            },
            {
                "companyName": "湖南省林森科技有限公司",
                "createDate": "2016.09.10 17:35:45",
                "money": "5900",
                "type": "2"
            }
        ],
        "11月": [
            {
                "companyName": "杭州心科技有限公司",
                "createDate": "2016.11.14 17:35:45",
                "money": "-200",
                "type": "1"
            },
            {
                "companyName": "湖南省林森科技有限公司",
                "createDate": "2016.11.10 17:35:45",
                "money": "-5900",
                "type": "1"
            }
        ]
    }
}

這時候舆绎,我們的不同的月份鲤脏,直接就變成了Key值。然后Key值就會在變化吕朵。然后這個月的交易記錄內容就變成了這個月份Key值下的value值了猎醇。
說實話,我第一次拿到后臺傳給這個值的時候努溃,我內心是拒絕的硫嘶。別怪我太low,我真的沒見過key變化的JSON茅坛。然后開始想的就是把他繼續(xù)變成一個對象音半,來進行處理,我把這個JSON放入到了GsonFormat中,想繼續(xù)利用插件來生成Bean對象贡蓖。結果直接報錯了曹鸠。

為啥,因為GsonFormat插件把JSON變?yōu)锽ean對象是把這個Key值作為屬性名字斥铺,畢竟一般都認為Key值不變彻桃。但是你的Key值在變化。無法成功生成晾蜘。

我的解決方式(提下我用的是GSON):

把obj部分的內容拿出來邻眷。因為obj里面的內容中有key值在變,但還是符合規(guī)定的JSON格式剔交。我們可以把他變?yōu)镴SON對象肆饶。

public class Bean {

    private boolean success;
    private String msg;
    private JsonObject obj;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public JsonObject getObj() {
        return obj;
    }

    public void setObj(JsonObject obj) {
        this.obj = obj;
    }
}

這里的JsonObject是com.google.gson.JsonObject,因為我是用Gson來解析JSON的岖常。

這樣我們就可以順利的把后臺傳過來的JSON轉成了我們這個新的Bean對象了驯镊。我們可以繼續(xù)用上面的Rtrofit+Rxjava 的代碼來訪問:

@GET("accountManage/getOrders.do")
    Observable<Bean> getDealQuery(
            @Query("companyCode")String companyCode,
            @Query("orderID")int orderID,
            @Query("status")int status);

切記不要把這個新的Bean.java中的private JsonObject obj;換成什么private Obeject obj;等,不然等會拿到的Bean對象中的obj部分會是{ }這樣,里面是空的板惑。
為什么?你還好意思問我為什么!? 因為這個obj的JSON部分不能正確轉換成對象啊橄镜。不然剛那個GsonFormat插件就幫你轉成對象了啊7氤恕G⒔骸!裆馒!

好了姊氓。我們就拿到這個Bean對象后。我們通過bean.getObj()方法就順利拿到了JsonObject這個對象了领追。然后我們在對這個對象進行處理他膳。我們需要對他進行遍歷,然后分別拿到里面的Key值及Value值绒窑。然后我們可以再對里面的Value值轉換成一個對象棕孙。

  1. 我們一步步來,先進行遍歷些膨,分別拿到Key 和Value:
JsonObject jsonObject = bean.getObj();
if (jsonObject != null) {
    Set<Map.Entry<String, JsonElement>> entrySet = jsonObject.entrySet();
    for (Map.Entry<String, JsonElement> entry : entrySet) {
         //entry.getKey()   
         //這是拿到了Key值蟀俊,也就是我們的month月份值     
         //jsonObject.getAsJsonArray(entry.getKey()) 
         //我們拿到了value里面的值.
         //因為value是一個JSON數(shù)組類型,所以我們直接用getAsJsonArray方法來獲取。
    }
}    
  1. 我們來把value值轉成對象订雾。
    好了肢预。我們就來再建一個類。來把Value值中的JsonArray轉成相應的對象洼哎。這樣后面處理起來也方便烫映。當然這里我們可以繼續(xù)用我們的GsonFormat插件來生成。

public class ItemBean {
    
    private String companyName;
    private String createDate;
    private String money;
    private String type;

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getCreateDate() {
        return createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

轉換為把JsonArray轉換成List<ItemBean>的代碼為:

Gson googleJson = new Gson();
List<ItemBean> value =
               googleJson.fromJson(jsonObject.getAsJsonArray(entry.getKey()), new TypeToken<List<DealQueryInfoBean>>() {
                                            }.getType());
//轉換成泛型類型噩峦,后面不能單純的寫成fromJson(XXX,ArrayList.class);

就這樣我們成功的把這個特殊的json轉換好了锭沟。變成了一個新的可操作的對象。后面的邏輯就大家自行寫了识补。????????????

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末族淮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凭涂,更是在濱河造成了極大的恐慌祝辣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件切油,死亡現(xiàn)場離奇詭異蝙斜,居然都是意外死亡,警方通過查閱死者的電腦和手機澎胡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門孕荠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绢片,“玉大人,你說我怎么就攤上這事岛琼。” “怎么了巢株?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵槐瑞,是天一觀的道長。 經常有香客問我阁苞,道長困檩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任那槽,我火速辦了婚禮悼沿,結果婚禮上,老公的妹妹穿的比我還像新娘骚灸。我一直安慰自己糟趾,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布甚牲。 她就那樣靜靜地躺著义郑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丈钙。 梳的紋絲不亂的頭發(fā)上非驮,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音雏赦,去河邊找鬼劫笙。 笑死,一個胖子當著我的面吹牛星岗,可吹牛的內容都是我干的填大。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伍茄,長吁一口氣:“原來是場噩夢啊……” “哼栋盹!你這毒婦竟也來了?” 一聲冷哼從身側響起敷矫,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤例获,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后曹仗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榨汤,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年怎茫,在試婚紗的時候發(fā)現(xiàn)自己被綠了收壕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓灌。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蜜宪,靈堂內的尸體忽然破棺而出虫埂,到底是詐尸還是另有隱情,我是刑警寧澤圃验,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布掉伏,位于F島的核電站,受9級特大地震影響澳窑,放射性物質發(fā)生泄漏斧散。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一摊聋、第九天 我趴在偏房一處隱蔽的房頂上張望鸡捐。 院中可真熱鬧,春花似錦麻裁、人聲如沸箍镜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹿寨。三九已至,卻和暖如春薪夕,著一層夾襖步出監(jiān)牢的瞬間脚草,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工原献, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馏慨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓姑隅,卻偏偏與公主長得像写隶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讲仰,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 之前在項目需求討論-后臺返回的特殊JSON處理中講了Json中Key是變值的情況時慕趴,Android端如何來進行處理...
    青蛙要fly閱讀 1,065評論 5 9
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)鄙陡,斷路器冕房,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法趁矾,內部類的語法耙册,繼承相關的語法,異常的語法毫捣,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 你解釋著孤寂與無力他卻相信那只是情緒因為結局才是故事 忘記了是從哪里讀到的這句話了详拙,只是當我讀《挪威的森林》里帝际,深...
    簡書ReaderMan閱讀 337評論 0 0
  • 2、視頻測試法 要學會給你的產品時不時做朋友圈小實驗 通過視頻撥開產品使用饶辙、組合成分蹲诀、優(yōu)點成分 小視頻分享更具殺傷...
    有才華的李豹閱讀 534評論 0 0