Gson 泛型封裝model

在項目開發中和服務端使用json數據格式進行交互的時候,通常服務端返回的數據會約定一個數據格式,例如:


{"code":"0","message":"success","data":{}}

我們真正需要的data所包含的數據,而code只使用一次,message很少用到。如果Gson不支持泛型或不知道Gson支持泛型的一定會這么定義Model。

public class UserModel {

    public int code;
    public String message;
    public User data;

    public static class User {
        public int name;
        public int age;
        public int sex;
    }
}

當其它接口的時候又重新定義一個XXResponse將data的類型改成XX,很明顯code,和message被重復定義了多次,通過泛型的話我們可以將code和message字段抽取到一個Result的類中,這樣我們只需要編寫data字段所對應的Model即可,更專注于我們的業務邏輯。如:

public class Result<T> {
    public int code;
    public String message;
    public T data;
}

到了這一步接下來肯定有些伙伴會這樣寫

public class UserModel extends Result<UserModel> {
    public int name;
    public int age;
    public int sex;
}
//解析的時候這樣解析
//gson.fromJson(json, UserModel.class);

如果你信心滿滿的按照上面這種寫法的話發現解析出來的UserModel對象里面的屬性都沒有值,如果你調試的話就會發現UserModel 中的data 字段是有值的。

正確的做法:

public class UserModel {
    public int name;
    public int age;
    public int sex;
}
//解析的時候這樣解析
//gson.fromJson(json, new TypeToken<Result<UserModel>>(){}.getType());

泛型封裝統一的Model就講到這了,Gson框架其實是很強大的,在這里再介紹一個開發中可能碰到的關于JSON解析的問題。

有次我們服務端的人員很操蛋的將一個字段的Key定義為了short,當我封裝model模型的時候懵逼了,what?不帶這樣玩的。當然你可以很理直氣壯的讓服務端的開發人員將字段改一下,但萬一此接口還有其他的平臺使用,比如PHP,你這樣要求別人改那PHP的哥們已經寫好了可能就不樂意了,那我們有沒有什么辦法自己解決這個問題呢?當然利用Gson是可以實現的。
我們知道Gson在序列化和反序列化時需要使用反射,說到反射就不得不想到注解,一般各類庫都將注解放到annotations包下,打開源碼在com.google.gson包下果然有一個annotations,里面有一個SerializedName的注解類,這應該就是我們要找的。
那么對于json中short這個屬性我們可以這樣定義:

@SerializedName("short")
public String mshort;

這樣的話,很好的保留了前端、后臺、Android/java各自的命名習慣。

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

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,284評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 轉載:http://www.lxweimin.com/p/e740196225a4本文為作者根據日常使用結合Gson...
    朝花夕拾不起來閱讀 998評論 0 1
  • 2017-07-29 周六 閏六月初七 感賞今天順利的寫完這個月親子群的晨享日志,寫完之后,令我的心情感覺到超級的...
    代燦紅_六中閱讀 227評論 0 0
  • 小的時候,我們家的孩子就是別人爸媽口中里的別人家的孩子。從小見到鄰居親戚都會夸我們家的孩子懂事,我也感覺自己很懂事...
    72f0392bffcf閱讀 172評論 0 0