從業務方面淺談Gson的使用方法

Tips:.本文主要從開發業務方面探討Gson的使用方法。個人愚見,希望所有幫助。

首先附上官方的API文檔,所有的博客都是起到輔助理解的作用,想要深入,最好學好英語看官方API。
http://www.javadoc.io/doc/com.google.code.gson/gson/2.8.0

1.業務上常用且最基本對象轉json字符串,json字符串轉對象。

a.對象轉json

Gson gson = new Gson();
String str = gson.toJson(Object);

b.json轉對象

Gson gson = new Gson();
Object obj = gson.fromJson(str, Object.class);

2.複雜對象(List<Object>),複雜Json字符串轉換,需使用Gson的TypeToken類

這裏解釋一下TypeToken是什麼,Type是”類型”的意思,Token是”記號”的意思,翻譯過來就是類型記號。那麼什麼是類型記號?爲什麼要叫類型記號?

其實這個類是谷歌爲泛型量身打造的,因爲泛型只存在編譯級別,在運行時並沒有泛型的存在。(這裏涉及到java泛型的意義和用處,童鞋們可以自行去百度)。Gson爲了解析複雜Json字符串,需要在運行時記住泛型對象,所以造了一個類型記號類(TypeToken)來標記它。
其用法相當簡單:

a.對象轉json

同基本方法一樣

b.json轉對象

Type type= new TypeToken<List<String>>(){}.getType();
Gson gson = new Gson();
Object obj = gson.fromJson(str, type);

很多人看不懂 new TypeToken<List<String>>(){}.getType()爲什麼這麼寫。這裏解釋一下,首先前面的new TypeToken<List<String>>(){}其實是new了一個匿名內部類,我們的目的只是爲了調用它裏面的getType方法,所以採用匿名內部類來實現。通過getType方法可以記錄下List<String>裏面所有的類型。

3.JsonParser的使用場景

a.獲取單個值
在上面普通的Gson使用方法中,如果我們需要解析Json字符串,就要創建對應的JavaBean,如果在開發過程中我只需要其中的一兩個字段的值,或者這個Json我們只需要用一次,那麼再去創建javaBean就會顯得很麻煩。這時候我們就需要用到JsonParser
用法也很簡單:

JsonParser jsonParser = new JsonParser();
JsonObject jsonObject = (JsonObject) jsonParser.parse(str);
String value= jsonObject.get("key").getAsString();

這裏要注意jsonObject.get(“key”)獲取的jsonElement一定要是個字符串,否則用getAsSting會出異常。要與本身的toString 區分開來,toString的對象可以不用是字符串。

b.解析轉義字符串
有時候我們會發現後臺傳過來的數據可能帶有很多反斜槓,類似於這樣

發生這種情況的原因,是因爲嵌套使用了Gson轉字符串導致的。我們設想一下,我們有一個班級類Clazz,班級裏面有一個學生Student。開發人員首先將Student用Gson轉成了Json字符串。因爲Student是個字符串,並且它是Json對象,所以裏面有引號。所以將Clazz轉爲Json時會把Student裏面的引號加反斜槓轉義。最後將這個Json字符串放進Clazz類裏面,這個Clazz類轉爲Json字符串時,Student就會出現轉義字符,也就是所謂的反斜槓。
如果我們要對這個Student進行反序列化,那麼第一步就是去除反斜槓。因爲不去除反斜槓,Student它只是一個字符串,並不能稱之爲Json對象。只有符合Json規範的字符串才能稱之爲Json對象。
因此我們在將Json字符串反序列化之前,也就是轉爲對應的實體類之前,我們首先要將它變爲符合Json對象的字符串。

JsonParser jsonParser = new JsonParser();
String jsonObject = (JsonObject) jsonParser.parse(str).toStrng();

隨後再進行反序列化成對象:

Gson gson = new Gson();
Object obj = gson.fromJson(jsonObject , Object.class);

4.GsonBuilder的使用場景

GsonBuilder的用法很靈活,它最大的好處就是可以定製一個我們自己想要的格式的Json字符串,同時也要配合註解的使用,比如

a.限定某個成員變量在序列化的時候不出現。

b.序列化日期的時候設置日期格式。

c.當需要序列化的值爲空時,採用null映射,否則會把該字段省略

d.將屬性的首字母大寫
等等。

在此就不再詳細介紹了,你們可以參考官方文檔詳細研究。

新建的時候方法也很簡單。

Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation() //a,配合註解@Expose使用,在成員變量上面加
        .setDateFormat("yyyy-MM-dd HH:mm:ss")//b
        .serializeNulls()//c
        .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE) //d   
        .create();

接下來的用法都一樣了

如有疑問請發我郵箱[email protected]

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