天天看點

Gson:GitHub 标星 18K 的 JSON 解析器,Google 出品的 Java JSON 解析器,強烈推薦!(1)

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.java

04、使用指南

不是我自吹自擂,是真的,我還是挺好用的,上手難度幾乎為零。如果你不相信話,可以來試試。

我有一個女朋友,她的名字和我一樣,也叫 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);

[好好學習, 天天向上]