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]