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

在實際開發中,現在安卓端和后臺之間的數據交互,一般都是用JSON來傳遞數據信息。JSON大家一般都比較熟悉。我這邊就以實際項目中的后臺傳過來的情況和大家分析下及如何處理。

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

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

普通格式

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

{
    "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快速實現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。然后開始想的就是把他繼續變成一個對象,來進行處理,我把這個JSON放入到了GsonFormat中,想繼續利用插件來生成Bean對象。結果直接報錯了。

為啥,因為GsonFormat插件把JSON變為Bean對象是把這個Key值作為屬性名字,畢竟一般都認為Key值不變。但是你的Key值在變化。無法成功生成。

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

把obj部分的內容拿出來。因為obj里面的內容中有key值在變,但還是符合規定的JSON格式。我們可以把他變為JSON對象。

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對象了。我們可以繼續用上面的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插件就幫你轉成對象了啊!!!!

好了。我們就拿到這個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數組類型,所以我們直接用getAsJsonArray方法來獲取。
    }
}    
  1. 我們來把value值轉成對象。
    好了。我們就來再建一個類。來把Value值中的JsonArray轉成相應的對象。這樣后面處理起來也方便。當然這里我們可以繼續用我們的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轉換好了。變成了一個新的可操作的對象。后面的邏輯就大家自行寫了。????????????

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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