01、前世今生
我叫 Gson,是一款開源的 Java 庫,主要用途為序列化 Java 對象為 JSON 字元串,或反序列化 JSON 字元串成 Java 對象。從我的名字上,就可以看得出一些端倪,我并非籍籍無名,我出身貴族,我爸就是 Google,市值富可敵國。
當然了,作為一個聰明人,我是有自知之明的,我在我爸眼裡,我并不是最閃耀的那顆星。
我來到這個世上,純屬一次意外,反正我爸是這樣對我說的,他總說我是從河邊撿回來的,雖然我一直不太相信。對于這件事,我向我媽确認過,她聽完笑得合不攏嘴,說我太天真。
長大後,我喜歡四處闖蕩,是以結識了不少同行,其中就有 Jackson 和 Fastjson。
說起 Jackson,我總能第一時間想到 MJ,那個被上帝帶走的流行天王。Jackson 在 GitHub 上有 6.1k 的 star,雖然他的粉絲數沒我多,但作為 Spring Boot 的預設 JSON 解析器,我非常地尊重他。
Fastjson 來自神秘的東方,雖然爆出過一些嚴重的漏洞,但這并不妨礙他成為最受歡迎的 JSON 解析器,他的粉絲數比我還要多,盡管我已經有超過 18K 的 star。
外人總說我們是競争對手,但我必須得告訴他們,我們仨的關系,好到就差穿同一條内褲了。
我們各有優勢,Jackson 在運作時占用的記憶體較少,Fastjson 的速度更快,而我,可以處理任意的 Java 對象,甚至在沒有源代碼的情況下。另外,我對泛型的支援也更加的友好。
02、添加依賴
在使用我的 API 之前,需要先把我添加到項目當中,推薦使用 Maven 和 Gradle 兩種形式。
Maven:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
Gradle:
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}
PS:Gradle 是一個基于 Apache Ant 和 Apache Maven 概念的項目自動化建構工具。Gradle 建構腳本使用的是 Groovy 或 Kotlin 的特定領域語言來編寫的,而不是傳統的 XML。
03、性能表現
不是我覺得,是真的,通過大量的測試證明,我在處理 JSON 的時候性能還是很牛逼的。
測試環境:雙核,8G 記憶體,64 位的 Ubuntu 作業系統(以桌面應用為主的 Linux 發行版)
測試結果:
1)在反序列化 25M 以上的字元串時沒有出現過任何問題。
2)可以序列化 140 萬個對象的集合。
3)可以反序列化包含 87000 個對象的集合。
4)将位元組數組和集合的反序列化限制從 80K 提高到 11M 以上。
測試用例我已經幫你寫好了,放在 GitHub 上,如果你不相信的話,可以驗證一下。
https://github.com/google/gson/blob/master/gson/src/test/java/com/google/gson/metrics/PerformanceTest.java04、使用指南
不是我自吹自擂,是真的,我還是挺好用的,上手難度幾乎為零。如果你不相信話,可以來試試。
我有一個女朋友,她的名字和我一樣,也叫 Gson,我的主要功能都由她來提供。你可以通過 new Gson() 的這種簡單粗暴的方式建立她,也可以打電話給一個叫 GsonBuilder 的老闆,讓他郵寄一個複刻版過來,真的,我不騙你。
先來看一個序列化的例子。
Gson gson = new Gson();
System.out.println(gson.toJson(18));
System.out.println(gson.toJson("沉默"));
System.out.println(gson.toJson(new Integer(18)));
int[] values = { 18,20 };
System.out.println(gson.toJson(values));
在我女朋友的幫助下,你可以将基本資料類型 int、字元串類型 String、包裝器類型 Integer、int 數組等等作為參數,傳遞給 toJson() 方法,該方法将會傳回一個 JSON 形式的字元串。
來看一下輸出結果:
18
"沉默"
[18,20]
再來看一下反序列化的例子。
int one = gson.fromJson("1", int.class);
Integer two = gson.fromJson("2", Integer.class);
Boolean false1 = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"王二\"", String.class);
String[] anotherStr = gson.fromJson("[\"沉默\",\"王二\"]", String[].class);
System.out.println(one);
System.out.println(two);
System.out.println(false1);
System.out.println(str);
System.out.println(Arrays.toString(anotherStr));
toJson() 方法用于序列化,對應的,fromJson() 方法用于反序列化。不過,你需要在反序列化的時候,指定參數的類型,是 int 還是 Integer,是 Boolean 還是 String,或者 String 數組。
1
2
false
王二
[沉默, 王二]
上面的例子都比較簡單,還展現不出來我的威力。
下面,我們來自定義一個類:
public class Writer {
private int age = 18;
private String name = "王二";
private transient int sex = 1;
然後,我們來将其序列化:
Writer writer = new Writer();
String json = gson.toJson(writer);
System.out.println(json);
用法和之前一樣簡單,來看一下輸出結果:
{"age":18,"name":"王二"}
同樣,可以将結果反序列化:
Writer writer1 = gson.fromJson(json, Writer.class);
這裡有一些注意事項,我需要提醒你。
1)推薦使用 private 修飾字段。
2)不需要使用任何的注解來表明哪些字段需要序列化,哪些字段不需要序列化。預設情況下,包括所有的字段,以及從父類繼承過來的字段。
3)如果一個字段被 transient 關鍵字修飾的話,它将不參與序列化。
4)如果一個字段的值為 null,它不會在序列化後的結果中顯示。
5)JSON 中缺少的字段将在反序列化後設定為預設值,引用資料類型的預設值為 null,數字類型的預設值為 0,布爾值預設為 false。
接下來,來看一個序列化集合的例子。
List<String> list =new ArrayList<>();
list.add("好好學習");
list.add("天天向上");
String json = gson.toJson(list);
結果如下所示:
["好好學習","天天向上"]
反序列化的時候,也很簡單。
List<String> listResult = gson.fromJson(json,List.class);
[好好學習, 天天向上]