Gson高級使用和GsonBuilder設(shè)置

本博客是一個純技術(shù)交流博客搜贤,寫出來的文章是幫大家解決一些問題,或讓大家有個參考和思路钝凶,更多技術(shù)分享請關(guān)注http://blog.36dr.net仪芒,有任何問題可與我郵件dr.kalen@yahoo.com

概述

在開發(fā)領(lǐng)域中數(shù)據(jù)傳遞有很多形式耕陷,通常數(shù)據(jù)調(diào)用交互采用XML掂名,JSON,數(shù)據(jù)流哟沫,純文本等形式饺蔑;越來越多數(shù)據(jù)調(diào)用采用JSON,因為JSON數(shù)據(jù)結(jié)構(gòu)簡單嗜诀,數(shù)據(jù)字節(jié)長度短猾警,既簡單又快速何樂而不為呢?

從JSON的結(jié)構(gòu)入手隆敢,所有json數(shù)據(jù)最終分為三種情況:

  1. 標量(Scalar)发皿,也就是單純的字符串或則數(shù)字形式
  2. 序列(Sequence),也就是若干數(shù)據(jù)按照一定順序并列在一起又稱“數(shù)組”
  3. 映射(Mapping)拂蝎,也就是key/value鍵值對
    Json的規(guī)格非常簡單,此文章就不一一描述:
"{"name":"kalen", "age":22}"

默認Gson只能序列和反序列基本數(shù)據(jù)類型和Date類型穴墅,其他類型如枚舉都需要自定義解析器registerTypeAdapter
在Android開發(fā)是使用:

<dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
   <version>2.1</version>
</dependency>
or
compile 'com.google.code.gson:gson:2.3.1'

Gson 快速使用

  1. 普通對象(Mapping)數(shù)據(jù)解析
  String json_str = "{"name":"kalen", "age":22}";
  Gson gson = new Gson();
  User user = gson.fromGson(json_str, User.class);

通過Gson中的fromGson即可將JSON數(shù)據(jù)解析并且賦值到User對象中,Gson原理則采用反射機制實現(xiàn),具體可Google查詢Gson原理玄货。

  1. 數(shù)組數(shù)據(jù)(Sequence)數(shù)據(jù)解析
Type listType = new TypeToken<List<String>>() {}.getType();//數(shù)組對應(yīng)gson中的類型
List<String> target = new LinkedList<String>();//gson需要的轉(zhuǎn)換對象或則數(shù)據(jù)來源
target.add("blah");
Gson gson = new Gson();
String json = gson.toJson(target, listType);
List<String> target2 = gson.fromJson(json, listType);

Gson高級使用

1.GsonBuilder

Gson是通過GsonBuilder生成皇钞,設(shè)定Gson的序列化和返序列號數(shù)據(jù)如:

Gson gson = new GsonBuilder()     
.registerTypeAdapter(Id.class, new IdTypeAdapter())   
.enableComplexMapKeySerialization()
.serializeNulls()   
.setDateFormat(DateFormat.LONG)  
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//會把字段首字母大寫
.setPrettyPrinting()
.setVersion(1.0)    
.create();

以上則是單獨對Id類設(shè)置了獨立解析方式,以及設(shè)置時間的解析格式為長時間形式松捉。

2.@Expose注解

如果采用new Gson()方式創(chuàng)建Gson則@Expose則沒有任何效果夹界,若采用GsonBuilder創(chuàng)建Gson并且調(diào)用了excludeFieldsWithoutExposeAnnotation則@Expose將會影響toJson和fromGson序列化和反序列化數(shù)據(jù)。如:

public class User {
    @Expose private String firstName;
    @Expose(serialize = false) private String lastName;
    @Expose(serialize = false, deserialize = false)
    private String emailAddress;
    private String password;
 }

例子中password不管是toJson還是fromJson都不會用到隘世,emailAddress和lastName在序列化(fromJson)時將被采用掉盅,emailAddress在反序列化(toJson)時將不被采用。

可以通過@SerializedName對序列字段進行重命名以舒,也可以自定義注解然后設(shè)置Gson字段解析策略setFieldNamingStrategy,具體在Retrofit Demo中有應(yīng)用。

3.GsonBuilder方法解釋

  • setFieldNamingPolicy 設(shè)置序列字段的命名策略(UPPER_CAMEL_CASE,UPPER_CAMEL_CASE_WITH_SPACES,LOWER_CASE_WITH_UNDERSCORES,LOWER_CASE_WITH_DASHES)
  • addDeserializationExclusionStrategy 設(shè)置反序列化時字段采用策略ExclusionStrategy慢哈,如反序列化時不要某字段蔓钟,當然可以采用@Expore代替。
  • excludeFieldsWithoutExposeAnnotation 設(shè)置沒有@Expore則不序列化和反序列化
  • addSerializationExclusionStrategy 設(shè)置序列化時字段采用策略卵贱,如序列化時不要某字段滥沫,當然可以采用@Expore代替。
  • registerTypeAdapter 為某特定對象設(shè)置固定的序列和反序列方式键俱,實現(xiàn)JsonSerializer和JsonDeserializer接口
  • setFieldNamingStrategy 設(shè)置字段序列和反序列時名稱顯示兰绣,也可以通過@Serializer代替
  • setPrettyPrinting 設(shè)置gson轉(zhuǎn)換后的字符串為一個比較好看的字符串
  • setDateFormat 設(shè)置默認Date解析時對應(yīng)的format格式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市编振,隨后出現(xiàn)的幾起案子缀辩,更是在濱河造成了極大的恐慌,老刑警劉巖踪央,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異健无,居然都是意外死亡累贤,警方通過查閱死者的電腦和手機臼膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來论巍,“玉大人嘉汰,你說我怎么就攤上這事鞋怀。” “怎么了残腌?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵孩灯,是天一觀的道長败匹。 經(jīng)常有香客問我哎壳,道長,這世上最難降的妖魔是什么刹泄? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堪簿。我一直安慰自己,他們只是感情好虑瀑,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铭污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天扼倘,我揣著相機與錄音爪喘,去河邊找鬼腥放。 笑死泛啸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的秃症。 我是一名探鬼主播种柑,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼岗仑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了聚请?” 一聲冷哼從身側(cè)響起荠雕,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盖文,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蚯姆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年五续,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄恋。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡疙驾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郭毕,到底是詐尸還是另有隱情它碎,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布显押,位于F島的核電站链韭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏煮落。R本人自食惡果不足惜敞峭,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝉仇。 院中可真熱鬧旋讹,春花似錦殖蚕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鞭呕,卻和暖如春蛤育,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葫松。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工瓦糕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腋么。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓咕娄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珊擂。 傳聞我的和親對象是個殘疾皇子圣勒,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1.概述2.Gson的目標3.Gson的性能和擴展性4.Gson的使用者5.如何使用Gson 通過Maven來使用...
    人失格閱讀 14,263評論 2 18
  • 為了更好的學(xué)習(xí)Gson,特將Gson User Guide翻譯如下摧扇。由于本人英文水平有限圣贸,如有錯誤,還請指正扛稽,謝謝...
    WeberLisper閱讀 6,839評論 0 6
  • 第一次使用簡書發(fā)文吁峻,也很少在手機上碼字,聽朋友說不錯庇绽,就下載了锡搜,試著寫一下橙困,算是瞎寫吧瞧掺! 讀高中時,大家最煩的就是...
    師院小書童閱讀 907評論 0 1
  • 文/張西影 閱讀好的文章和做夢有很多共同之處凡傅。有時候我感覺做夢是愉快的辟狈,所以醒來之后伴隨夢鄉(xiāng)的感覺就去看看幾天來簡...
    豫視西影閱讀 250評論 3 0
  • 那天,我照常與老公還有他的幾個客戶一起去酒店吃飯夏跷。 酒酣耳熱哼转,餐桌上經(jīng)過一開始的互相吹捧和嬉笑之后,開始陷入自顧自...
    繡球flower閱讀 511評論 3 1