国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Gson:我爸是 Google

開發(fā) 前端
我叫 Gson,是一款開源的 Java 庫,主要用途為序列化 Java 對象為 JSON 字符串,或反序列化 JSON 字符串成 Java 對象。

[[358496]]

 01、前世今生

我叫 Gson,是一款開源的 Java 庫,主要用途為序列化 Java 對象為 JSON 字符串,或反序列化 JSON 字符串成 Java 對象。從我的名字上,就可以看得出一些端倪,我并非籍籍無名,我出身貴族,我爸就是 Google,市值富可敵國。

當然了,作為一個聰明人,我是有自知之明的,我在我爸眼里,我并不是最閃耀的那顆星。

我來到這個世上,純屬一次意外,反正我爸是這樣對我說的,他總說我是從河邊撿回來的,雖然我一直不太相信。對于這件事,我向我媽確認過,她聽完笑得合不攏嘴,說我太天真。

長大后,我喜歡四處闖蕩,因此結(jié)識了不少同行,其中就有 Jackson 和 Fastjson。

說起 Jackson,我總能第一時間想到 MJ,那個被上帝帶走的流行天王。Jackson 在 GitHub 上有 6.1k 的 star,雖然他的粉絲數(shù)沒我多,但作為 Spring Boot 的默認 JSON 解析器,我非常地尊重他。

Fastjson 來自神秘的東方,雖然爆出過一些嚴重的漏洞,但這并不妨礙他成為最受歡迎的 JSON 解析器,他的粉絲數(shù)比我還要多,盡管我已經(jīng)有超過 18K 的 star。

外人總說我們是競爭對手,但我必須得告訴他們,我們仨的關(guān)系,好到就差穿同一條內(nèi)褲了。

我們各有優(yōu)勢,Jackson 在運行時占用的內(nèi)存較少,F(xiàn)astjson 的速度更快,而我,可以處理任意的 Java 對象,甚至在沒有源代碼的情況下。另外,我對泛型的支持也更加的友好。

02、添加依賴

在使用我的 API 之前,需要先把我添加到項目當中,推薦使用 Maven 和 Gradle 兩種形式。

Maven:

  1. <dependency> 
  2.     <groupId>com.google.code.gson</groupId> 
  3.     <artifactId>gson</artifactId> 
  4.     <version>2.8.6</version> 
  5. </dependency> 

Gradle:

  1. dependencies { 
  2.   implementation 'com.google.code.gson:gson:2.8.6' 

PS:Gradle 是一個基于 Apache Ant 和 Apache Maven 概念的項目自動化建構(gòu)工具。Gradle 構(gòu)建腳本使用的是 Groovy 或 Kotlin 的特定領(lǐng)域語言來編寫的,而不是傳統(tǒng)的 XML。

03、性能表現(xiàn)

不是我覺得,是真的,通過大量的測試證明,我在處理 JSON 的時候性能還是很牛逼的。

測試環(huán)境:雙核,8G 內(nèi)存,64 位的 Ubuntu 操作系統(tǒng)(以桌面應(yīng)用為主的 Linux 發(fā)行版)

測試結(jié)果:

1)在反序列化 25M 以上的字符串時沒有出現(xiàn)過任何問題。

2)可以序列化 140 萬個對象的集合。

3)可以反序列化包含 87000 個對象的集合。

4)將字節(jié)數(shù)組和集合的反序列化限制從 80K 提高到 11M 以上。

測試用例我已經(jīng)幫你寫好了,放在 GitHub 上,如果你不相信的話,可以驗證一下。

https://github.com/google/gson/blob/master/gson/src/test/java/com/google/gson/metrics/PerformanceTest.java

04、使用指南

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

我有一個女朋友,她的名字和我一樣,也叫 Gson,我的主要功能都由她來提供。你可以通過 new Gson() 的這種簡單粗暴的方式創(chuàng)建她,也可以打電話給一個叫 GsonBuilder 的老板,讓他郵寄一個復(fù)刻版過來,真的,我不騙你。

先來看一個序列化的例子。

  1. Gson gson = new Gson(); 
  2. System.out.println(gson.toJson(18)); 
  3. System.out.println(gson.toJson("沉默")); 
  4. System.out.println(gson.toJson(new Integer(18))); 
  5. int[] values = { 18,20 }; 
  6. System.out.println(gson.toJson(values)); 

在我女朋友的幫助下,你可以將基本數(shù)據(jù)類型 int、字符串類型 String、包裝器類型 Integer、int 數(shù)組等等作為參數(shù),傳遞給 toJson() 方法,該方法將會返回一個 JSON 形式的字符串。

來看一下輸出結(jié)果:

  1. 18 
  2. "沉默" 
  3. 18 
  4. [18,20] 

再來看一下反序列化的例子。

  1. Gson gson = new Gson(); 
  2. int one = gson.fromJson("1"int.class); 
  3. Integer two = gson.fromJson("2"Integer.class); 
  4. Boolean false1 = gson.fromJson("false", Boolean.class); 
  5. String str = gson.fromJson("\"王二\"", String.class); 
  6. String[] anotherStr = gson.fromJson("[\"沉默\",\"王二\"]", String[].class); 
  7.  
  8. System.out.println(one); 
  9. System.out.println(two); 
  10. System.out.println(false1); 
  11. System.out.println(str); 
  12. System.out.println(Arrays.toString(anotherStr)); 

toJson() 方法用于序列化,對應(yīng)的,fromJson() 方法用于反序列化。不過,你需要在反序列化的時候,指定參數(shù)的類型,是 int 還是 Integer,是 Boolean 還是 String,或者 String 數(shù)組。

來看一下輸出結(jié)果:

  1. false 
  2. 王二 
  3. [沉默, 王二] 

上面的例子都比較簡單,還體現(xiàn)不出來我的威力。

下面,我們來自定義一個類:

  1. public class Writer { 
  2.     private int age = 18; 
  3.     private String name = "王二"
  4.     private transient int sex = 1; 

然后,我們來將其序列化:

  1. Writer writer = new Writer(); 
  2. Gson gson = new Gson(); 
  3. String json = gson.toJson(writer); 
  4. System.out.println(json); 

用法和之前一樣簡單,來看一下輸出結(jié)果:

  1. {"age":18,"name":"王二"

同樣,可以將結(jié)果反序列化:

  1. Writer writer1 = gson.fromJson(json, Writer.class); 

這里有一些注意事項,我需要提醒你。

1)推薦使用 private 修飾字段。

2)不需要使用任何的注解來表明哪些字段需要序列化,哪些字段不需要序列化。默認情況下,包括所有的字段,以及從父類繼承過來的字段。

3)如果一個字段被 transient 關(guān)鍵字修飾的話,它將不參與序列化。

4)如果一個字段的值為 null,它不會在序列化后的結(jié)果中顯示。

5)JSON 中缺少的字段將在反序列化后設(shè)置為默認值,引用數(shù)據(jù)類型的默認值為 null,數(shù)字類型的默認值為 0,布爾值默認為 false。

接下來,來看一個序列化集合的例子。

  1. List<String> list =new ArrayList<>(); 
  2. list.add("好好學習"); 
  3. list.add("天天向上"); 
  4. String json = gson.toJson(list); 

結(jié)果如下所示:

  1. ["好好學習","天天向上"

反序列化的時候,也很簡單。

  1. List<String> listResult = gson.fromJson(json,List.class); 

結(jié)果如下所示:

  1. [好好學習, 天天向上] 

我女朋友是一個很細心也很貼心的人,在你調(diào)用 toJson() 方法進行序列化的時候,她會先判 null,防止拋出 NPE,再通過 getClass() 獲取參數(shù)的類型,然后進行序列化。

  1. public String toJson(Object src) { 
  2.     if (src == null) { 
  3.         return toJson(JsonNull.INSTANCE); 
  4.     } 
  5.     return toJson(src, src.getClass()); 

但是呢?對于泛型來說,getClass() 的時候會丟掉參數(shù)化類型。來看下面這個例子。

  1. public class Foo<T> { 
  2.     T value; 
  3.  
  4.     public void set(T value) { 
  5.         this.value = value; 
  6.     } 
  7.  
  8.     public T get() { 
  9.         return value; 
  10.     } 
  11.  
  12.     public static void main(String[] args) { 
  13.         Gson gson = new Gson(); 
  14.         Foo<Bar> foo = new Foo<Bar>(); 
  15.         Bar bar = new Bar(); 
  16.         foo.set(bar); 
  17.  
  18.         String json = gson.toJson(foo); 
  19.     } 
  20.  
  21. class Bar{ 
  22.     private int age = 10; 
  23.     private String name = "圖靈"

假如你 debug 的時候,進入到 toJson() 方法的內(nèi)部,就可以觀察到。

foo 的實際類型為 Foo,但我女朋友在調(diào)用 foo.getClass() 的時候,只會得到 Foo,這就意味著她并不知道 foo 的實際類型。

序列化的時候還好,反序列化的時候就無能為力了。

  1. Foo<Bar> foo1 = gson.fromJson(json, foo.getClass()); 
  2. Bar bar1 = foo1.get(); 

這段代碼在運行的時候就報錯了。

  1. Exception in thread "main" java.lang.ClassCastException: class com.google.gson.internal.LinkedTreeMap cannot be cast to class com.itwanger.gson.Bar (com.google.gson.internal.LinkedTreeMap and com.itwanger.gson.Bar are in unnamed module of loader 'app'
  2.  at com.itwanger.gson.Foo.main(Foo.java:36) 

默認情況下,泛型的參數(shù)類型會被轉(zhuǎn)成 LinkedTreeMap,這顯然并不是我們預(yù)期的 Bar,女朋友對此表示很無奈。

作為 Google 的親兒子,我的血液里流淌著“貴族”二字,我又怎能忍心女朋友無助時的落寞。

于是,我在女朋友的體內(nèi)植入了另外兩種方法,帶 Type 類型參數(shù)的:

  1. toJson(Object src, Type typeOfSrc); 
  2. <T> T fromJson(String json, Type typeOfT); 

這樣的話,你在進行泛型的序列化和反序列化時,就可以指定泛型的參數(shù)化類型了。

  1. Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 
  2. String json = gson.toJson(foo,fooType); 
  3. Foo<Bar> foo1 = gson.fromJson(json, fooType); 
  4. Bar bar1 = foo1.get(); 

debug 進入 toJson() 方法內(nèi)部查看的話,就可以看到 foo 的真實類型了。

fromJson() 在反序列化的時候,和此類似。

這樣的話,bar1 就可以通過 foo1.get() 到了。

瞧,我考慮得多周全,女朋友都忍不住夸我了!

05、處理混合類型

你知道的,Java 不建議使用混合類型,也就是下面這種情況。

  1. List list = new ArrayList(); 
  2. list.add("沉默王二"); 
  3. list.add(18); 
  4. list.add(new Event("gson""google")); 

Event 的定義如下所示:

  1. class Event { 
  2.     private String name
  3.     private String source; 
  4.     Event(String name, String source) { 
  5.         this.name = name
  6.         this.source = source; 
  7.     } 

由于 list 沒有指定具體的類型,因此它里面可以存放各種類型的數(shù)據(jù)。這樣雖然省事,我女朋友在序列化的時候也沒問題,但反序列化的時候就要麻煩多了。

  1. Gson gson = new Gson(); 
  2. String json = gson.toJson(list); 
  3. System.out.println(json); 

輸出結(jié)果如下所示:

  1. ["沉默王二",18,{"name":"gson","source":"google"}] 

反序列化的時候,就需要花點心思才能拿到 Event 對象。

  1. JsonParser parser = new JsonParser(); 
  2. JsonArray array = parser.parse(json).getAsJsonArray(); 
  3. String message = gson.fromJson(array.get(0), String.class); 
  4. int number = gson.fromJson(array.get(1), int.class); 
  5. Event event = gson.fromJson(array.get(2), Event.class); 

承認了,JsonParser 是我的前任。希望你不要噴我渣男,真不是我花心,是因為我們性格上有些不太適合。但我們?nèi)匀槐3种笥训年P(guān)系,因為我們誰都沒有錯,只是代碼更加規(guī)范了,已經(jīng)很少有開發(fā)者使用混合類型了。

06、個性化定制

考慮到你是一個追求時髦的人,我一直對自己要求很高,力爭能夠滿足你的所有需求。這種高標準的要求,讓我女朋友對我是又愛又恨。

愛的是,我這種追求完美的態(tài)度;恨的是,她有時候力不從心,幫不上忙。

使用 toJson() 序列化 Java 對象時,返回的 JSON 字符串中沒有空格,很緊湊。如果你想要打印更漂亮的 JSON 格式,你需要打電話給一個叫 GsonBuilder 的老板,讓他進行一些定制,然后再把復(fù)刻版郵寄給你,就像我在使用指南中提到的那樣。

  1. public class Writer { 
  2.     private int age = 18; 
  3.     private String name = "沉默王二"
  4.  
  5.     public static void main(String[] args) { 
  6.         Writer writer = new Writer(); 
  7.         Gson gson = new Gson(); 
  8.         String json = gson.toJson(writer); 
  9.         System.out.println(json); 
  10.  
  11.         Gson gson1 = new GsonBuilder().setPrettyPrinting().create(); 
  12.         String jsonOutput = gson1.toJson(writer); 
  13.         System.out.println(jsonOutput); 
  14.     } 

來對比一下輸出結(jié)果:

  1. {"age":18,"name":"沉默王二"
  2.   "age": 18, 
  3.   "name""沉默王二" 

通過 setPrettyPrinting() 定制后,輸出的格式更加層次化、立體化,字段與值之間有空格,每個不同的字段之間也會有換行。

之前提到了,默認情況下,我女朋友在序列化的時候會忽略 null 值的字段,如果不想這樣的話,同樣可以打電話給 GsonBuilder。

  1. public class Writer { 
  2.     private int age = 18; 
  3.     private String name = null
  4.  
  5.     public static void main(String[] args) { 
  6.         Writer writer = new Writer(); 
  7.         Gson gson = new Gson(); 
  8.         String json = gson.toJson(writer); 
  9.         System.out.println(json); 
  10.  
  11.         Gson gson2 = new GsonBuilder().serializeNulls().create(); 
  12.         String jsonOutput2 = gson2.toJson(writer); 
  13.         System.out.println(jsonOutput2); 
  14.     } 

來對比一下輸出結(jié)果:

  1. {"age":18} 
  2. {"age":18,"name":null

通過 serializeNulls() 定制后,序列化的時候就不會再忽略 null 值的字段。

也許,你在序列化和反序列化的時候想要篩選一些字段,我也考慮到這種需求了,特意為你準備了幾種方案,你可以根據(jù)自己的口味挑選適合你的。

第一種,通過 Java 修飾符。

你之前也看到了,使用 transient 關(guān)鍵字修飾的字段將不會參與序列化和反序列化。同樣的,static 關(guān)鍵字修飾的字段也不會。如果你想保留這些關(guān)鍵字修飾的字段,可以這樣做。

保留單種。

  1. Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).create(); 

保留多種。

  1. Gson gson = new GsonBuilder() 
  2.     .excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE) 
  3.     .create(); 

第二種,通過 @Expose 注解。

要使用 @Expose 注解,你需要先這樣做:

  1. Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 

再在需要序列化和反序列化的字段上加上 @Expose 注解,如果沒加的話,該字段將會被忽略。

  1. @Expose 
  2. private int age = 18; 

07、心聲

如果你還想了解更多的話,請來參觀我的 GitHub 主頁:

https://github.com/google/gson

我會向你坦露我的一切,毫不保留的,除了我和女朋友之間的一些秘密,只為能夠幫助到你。

本文轉(zhuǎn)載自微信公眾號「沉默王二」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系沉默王二公眾號。

 

責任編輯:武曉燕 來源: 沉默王二
相關(guān)推薦

2019-03-04 09:58:26

2015-08-10 14:56:31

Google

2013-10-12 17:31:26

2010-08-05 16:04:45

2014-11-10 09:29:13

Google

2009-08-11 11:23:41

什么是GAEGoogle App

2009-07-10 09:40:16

Google操作系統(tǒng)Chrome市場

2012-12-28 10:45:51

2013-04-24 09:08:17

Google眼鏡

2013-10-22 10:03:11

2013-10-22 09:36:48

2011-04-25 09:34:52

PythoncGO

2011-08-01 09:08:49

程序員

2014-11-04 11:19:51

2022-07-12 15:23:38

勒索軟件網(wǎng)絡(luò)攻擊

2009-05-15 09:31:31

網(wǎng)站性能延時Javascript

2015-09-09 08:40:39

Java簡單入門

2010-05-20 16:47:25

Office 2010Google Apps

2010-10-28 09:38:56

Android

2012-02-20 10:26:11

Web Apps
點贊
收藏

51CTO技術(shù)棧公眾號

国产成人在线观看| 亚洲日本一区二区三区在线不卡 | 日韩中文字幕二区| 久久精品视频在线免费观看 | 台湾亚洲精品一区二区tv| 国产91在线|亚洲| 麻豆传媒一区| av亚洲在线观看| 91久久中文字幕| 欧美中文一区| 91精品久久久久久久久久| 午夜亚洲福利| 免费看污久久久| 国产成人一区二区精品非洲| 成人在线观看a| 综合久久一区二区三区| 毛片在线免费| 精品国产a毛片| sqte在线播放| 九九热99久久久国产盗摄| 国产精品流白浆在线观看| 国产精品一区二区三区在线播放 | 成人毛片老司机大片| 四色永久免费网站| 在线观看www91| 中文字幕一区久| 国产69久久精品成人看| 亚洲一级一区| 国产96在线 | 亚洲| 一区二区三区在线播放| 日本免费中文字幕在线| 最近2019中文字幕一页二页| 久久久免费毛片| 国产精品午夜av在线| 国产91在线观看丝袜| 国产农村av| 亚洲高清av在线| 教室别恋欧美无删减版| 手机在线观看国产精品| 91色porny| av资源网站在线观看| 精品精品国产国产自在线| 91成人免费| 国产免费毛卡片| 欧美人妖巨大在线| 伊人久久大香| 精品一卡二卡三卡四卡日本乱码| 四虎永久精品在线| av色综合网| 最新热久久免费视频| 日本中文字幕电影在线观看| 欧美电影影音先锋| 亚洲国产福利| 欧美日本高清视频| 香蕉国产精品| 日韩av高清在线播放| 91亚洲精品一区二区乱码| 国产精品一区二区小说| 亚洲欧美区自拍先锋| av激情在线| 日韩有码片在线观看| 999精品一区| 在线成人性视频| 亚洲综合色区另类av| 大菠萝精品导航| 欧美综合激情网| 销魂美女一区二区三区视频在线| 国产96在线 | 亚洲| 91色乱码一区二区三区| 九色在线网站| 欧美系列在线观看| 蜜桃视频在线观看视频| 亚洲高清av在线| 清纯唯美亚洲综合一区| 写真片福利在线播放| 日本欧洲国产一区二区| 国产网友自拍电影在线| 第一区第二区在线| 91亚洲国产成人精品一区二区三 | 久久乐国产精品| 爽好久久久欧美精品| 国产一级爱c视频| 18欧美乱大交hd1984| 粉嫩av一区二区| 久久久久久亚洲精品不卡4k岛国| 欧美性受xxxx黑人xyx性爽| 亚洲激情偷拍| 深夜国产在线播放| 亚洲精品日韩在线观看| 亚洲欧美一区二区三区在线 | 丰满少妇久久久久久久| 在线视频日韩一区| 国产成人免费视频网站高清观看视频 | 欧美国产亚洲一区| 麻豆国产精品va在线观看不卡| 久久亚洲捆绑美女| 欧美调教在线| 黄动漫在线看| 久久久久九九九| 亚洲欧美中文另类| 久久久久国产精品免费免费搜索| 日韩av三区| 精品三级久久久久久久电影聊斋| 欧美极品色图| 正在播放国产一区| 亚洲欧美日韩一区| 激情亚洲成人| 欧美日韩大片| 亚洲欧美在线精品| 91免费看片在线| 日韩欧美在线一区二区三区| 懂色中文一区二区在线播放| 国产乱人伦精品一区| 国产69久久| 国产女主播自拍| 日产日韩在线亚洲欧美| 欧美日韩中文字幕一区| 国产美女精品一区二区三区| 欧美电影免费网站| 午夜不卡视频| www.浪潮av.com| 91久久久久久久一区二区| 日韩亚洲国产中文字幕欧美| 久久综合九色综合欧美亚洲| 久久久久久亚洲精品美女| 国内精品在线观看视频| 久久精品一区中文字幕| 99re热这里只有精品免费视频| 蜜桃a∨噜噜一区二区三区| 色成人亚洲网| 国产福利在线看| 野花国产精品入口| 日韩精品一区二区三区视频播放 | 亚洲一区二区免费| 如如影视在线观看经典| 国内一区二区三区| 欧美变态tickling挠脚心| 婷婷视频在线播放| 四虎国产精品永久在线国在线| 99热在这里有精品免费| 国语对白做受69| 毛片在线网址播放| 亚洲第一伊人| 亚洲精品理论电影| 日本韩国欧美在线观看| 天美av一区二区三区久久| 欧美日韩亚洲精品内裤| 久久亚洲综合网| 黄色综合网址| 国产日韩欧美亚洲| 国产日韩欧美一二三区| 免费成人黄色| 国产高清亚洲一区| 国模精品视频一区二区三区| 自拍av在线| 久久久水蜜桃av免费网站| 亚洲天堂色网站| 99色在线播放| 欧美久久视频| 精品调教chinesegay| 亚欧在线免费观看| 图片区亚洲欧美小说区| 欧美videos中文字幕| 欧美日韩黄色一级片| 日本中文字幕在线一区| 欧洲视频一区二区| 久久久成人精品一区二区三区| 宅男噜噜噜66国产精品免费| 亚洲精品你懂的| 久久青青草原| 伊人久久大香线蕉综合影院首页| 亚洲国产精品久久人人爱蜜臀| 欧美不卡1区2区3区| 久久久久久一区二区三区四区别墅| 亚洲女同女同女同女同女同69| 国模精品一区二区三区| 欧美××××黑人××性爽| 亚洲人成网站精品片在线观看 | 久久影院资源站| 川上优的av在线一区二区| 男人的天堂狠狠干| 亚洲专区在线视频| 日本10禁啪啪无遮挡免费一区二区| 国模套图日韩精品一区二区| 亚洲欧洲精品一区二区精品久久久| 亚洲伊人一本大道中文字幕| 成人免费图片免费观看| 国产精品乱码人人做人人爱| 国产伦精品一区二区三区照片91| 涩涩视频在线免费看| 成人欧美一区二区三区1314| 久久超碰亚洲| 蜜桃在线一区| 欧美日韩你懂得| 久久国产成人精品国产成人亚洲| 婷婷综合五月| 中国人与牲禽动交精品| 天堂av网在线| av电影天堂一区二区在线| 666精品在线|