Gson Advanced — 自定義對象實例創建

原文鏈接:Gson Advanced — Custom Instance Creator
原文出自:Norman Peitek
譯者:無名無

之前幾篇文章我們介紹瞭如何使用 Gson 來自定義(反)序列化,目的是減少 JSON 以及優化傳遞。本文將介紹如何自定義反序列化實例創建。

有一種情況是,客戶端的 Model 中包含了一種特殊類型的變量,這就##需要我們在反序列中進行創建。

Gson 對象實例創建

默認情況下,Gson 創建的是無參的 Java model 實例,然後通過反射設置屬性,如果你的 Model 只作爲簡單的數據存儲,這種情況並不需要我們考慮自定義。

但是,如果你的 Model 中包含有默認或者動態設置的屬性,你必須避開 Gson 使用反射。幸運的是,Gson 幫我們考慮到了,可以使用 InstanceCreators 來解決。

看個例子:

 {
      "age": 26,
      "email": "[email protected]",
      "isDeveloper": true,
      "name": "Norman"
} 

首先,需要一個對應的 Java model 用來映射 JSON,但此 model 中包含一個 Context,這個 Context 要用來存儲 Java object 到數據庫中,並不能被 JSON 匹配到,這就需要我們來創建。

public class UserContext {  
    private String name;
    private String email;
    private boolean isDeveloper;
    private int age;

    // additional attribute, which is not part of the data model
    private Context context; 

    public UserContext(Context context) {
        this.context = context;
    }
}

如果你還是用原來的方式來反序列化,那麼得到的 Context 肯定是null。你需要在映射之前的構造函數中來創建 Context,這是就需要用到 InstanceCreators。

和自定義序列化很相似,需要設置一個 Adapter:

String userSimpleJson = ...; // the JSON from the server, see above

GsonBuilder gsonBuilder = new GsonBuilder();  
gsonBuilder.registerTypeAdapter(  
    UserContext.class, 
    new UserContextInstanceCreator(getApplicationContext())
);
Gson customGson = gsonBuilder.create();

UserContext customObject = customGson.fromJson(userSimpleJson, UserContext.class); 

還是 registerTypeAdapter() 方法來添加,不同的是第二個參數需要傳遞 InstanceCreator 實現類。

private class UserContextInstanceCreator implements InstanceCreator<UserContext> {  
    private Context context;

    public UserContextInstanceCreator(Context context) {
        this.context = context;
    }

    @Override
    public UserContext createInstance(Type type) {
        // create new object with our additional property
        UserContext userContext = new UserContext(context);

        // return it to gson for further usage
        return userContext;
    }
}

可以看到 UserContextInstanceCreator 實現了 InstanceCreator ,重寫 createInstance 方法,但是 UserContextInstanceCreator(Context context) 構造函數需要我們自己傳遞 Context參數,
所以要這樣使用 new UserContextInstanceCreator(getApplicationContext()),這樣才能保證每個 UserContext 中含有 Context 實例。

當然你還可以根據自己的需求自由的傳遞另一些參數。

目標

學習什麼是自定義 InstanceCreators 創建實例。

練習代碼已上傳 Github https://github.com/whiskeyfei/Gson-Review 可自行查看。

Gson 系列文章翻譯回顧

1、Gson - Java-JSON 序列化和反序列化入門
2、Gson - 映射嵌套對象
3、Gson - Arrays 和 Lists 映射對象
4、Gson - Map 結構映射
5、Gson - Set 集合映射
6、Gson - 空值映射
7、Gson Model Annotations - 如何使用 @SerializedName 更改字段的命名
8、Gson Model Annotations - @SerializedName 匹配多個反序列化名稱
9、Gson Builder - 基礎和命名規則
10、Gson Builder - 序列化空值
11、Gson Builder - 忽略策略
12、Gson Builder - Gson Lenient 屬性
13、Gson Builder - 特殊類型 Floats & Doubles
17、Gson Builder - 如何使用 @Expose 忽略字段
19、Gson Advanced - 映射枚舉類型
20、Gson Advanced - 映射循環引用
21、Gson Advanced - 泛型
22、Gson Advanced - 簡單自定義序列化 (Part 1)
24、Gson Advanced - 自定義反序列化基礎
25、Gson Advanced - 自定義對象實例創建
26、Gson Advanced - 通過 @JsonAdapter 自定義(反)序列化過程
32、Practical Gson - 如何解析多態對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章