Gson教程七(譯):@SerializedName和@Expose

該文章翻譯自Gson Tutorial Series系列教程。該篇探究的是如何使用如何使用@Expose忽略某些域以及使用@SerializedName改變域名近顷。

使用@Expose忽略某些域

@Expose注解模型

在閱讀了之前關于處理空值的教程后,你可能會想缤灵,你能夠將一個Java對象設置為空值怠蹂,但如何才能夠使之不出現在JSON中呢?這在你不想傳送你的私有或者敏感數據到網絡上時是必要的搀愧。不用擔心惰聂,Gson提供的@Expose注解能輕松解決這個問題。

@Expose注解是可選擇的并且提供了兩個配置參數:serializedeserialize咱筛。默認情況下搓幌,它們都設置為true。因此迅箩,你不用強制給每個成員變量添加@Expose注解溉愁,就像我們之前做的,所有成員變量會默認添加饲趋。如果你添加了@Expose注解拐揭,而沒有設置任何值為false撤蟆,該成員變量也會默認包含的。

讓我們重新看一下UserSimple類堂污,然后添加@Expose注解:

public class UserSimple {  
    @Expose()
    String name; // equals serialize & deserialize

    @Expose(serialize = false, deserialize = false)
    String email; // equals neither serialize nor deserialize

    @Expose(serialize = false)
    int age; // equals only deserialize

    @Expose(deserialize = false)
    boolean isDeveloper; // equals only serialize
}

上例中家肯,序列化的結果將只有nameisDeveloper會出現在JSON中。其他兩個域敷鸦,即使它們設置了息楔,也不會轉換。

在反序列化過程中扒披,Java對象將只會擁有JSON中的nameage域值依,emailisDeveloper將會被忽略。

默認情況下碟案,Gson實例會忽略掉@Expose注解愿险。為了使用它,你需要自定義Gson實例:

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

遵循此用法的gson才會注重Expose注解价说。

@Expose注解使得你可以輕松的空值哪些值可以被序列化和反序列化辆亏。建議在需要轉換所有值得情況下不要使用@Expose標簽。它僅僅會毀掉你的模型類鳖目。

Transient

@Expose的替代方法是在定義成員變量時添加transient關鍵字扮叨。添加了該關鍵字的成員變量將不會被轉換。然而领迈,你并不能像@Expose那樣完全掌控彻磁。你不能使一個方向運行而反方向又不能運行,transient將使得該域既不能序列化也不能反序列化狸捅。

public class UserSimple {  
    String name;
    String email;
    int age;
    boolean transient isDeveloper; // will not be serialized or deserialized
}

使用@SerializedName注解改變域名

@SerializedName注解模型

@SerializedName是一個非常有用的注解衷蜓。它改變了Java-JSON序列化和反序列化過程中的自動匹配。到目前為止尘喝,我們經常假設Java模型類和JSON有相同的“名”磁浇。然而,并不總是如此朽褪≈孟牛可能是你沒有獲得繼承Java模型類的允許,也可能是你必須遵循公司的命名規(guī)則缔赠,無論哪種情況交洗,你都可以使用@SerializedName以使得Gson能夠正確的匹配。

讓我們看個例子橡淑。我們的UserSimple類已經去掉了@Expose,它可以映射所有域了咆爽。

public class UserSimple {  
    String name;
    String email;
    boolean isDeveloper;
    int age;
}

然而梁棠,讓我們花點時間想象一下置森,API實現以及它所返回的JSON已經改變了。我們的API不再會返回name而是返回了fullName:

{
  "age": 26,
  "email": "norman@futurestud.io",
  "fullName": "Norman",
  "isDeveloper": true
}

不用擔心符糊,我們并不需要改變我們的基礎代碼凫海,我們僅僅需要在我們的模型中添加一個簡單的注解:

public class UserSimple {  
    @SerializedName("fullName")
    String name;
    String email;
    boolean isDeveloper;
    int age;
}

在該注解的幫助下,Gson又可以映射良好了男娄,我們又可以享受自動化帶來的好處了行贪。

當然,你可以使用@SerializedName去遵從你們公司的命名規(guī)則模闲,但是依然可以正確匹配任何API建瘫。這在命名規(guī)則非常不同時是有用的。

使用@SerializedName反序列化多個名稱

在之前的博客中尸折,我們已經介紹了如何在序列化和反序列化過程中改變一個模型的屬性名啰脚。如果你的服務器希望接收或者發(fā)送的屬性名是不一樣的,那么你可以使用@SerializedName实夹。

在這篇博客中橄浓,我們將想你展示,如何實現一個屬性對應多個名稱的映射亮航。這在你的應用需要與多個API通信時是非常有用的荸实。盡管這些API使用不同的名稱描述了相同的事情,你依然可以只使用一個Java模型類缴淋。

擴展@SerializedName注解模型

在介紹@SerializedName的第一篇博客中准给,我們向你介紹了如下用法:

public class UserSimple {  
    @SerializedName("fullName")
    String name;

    String email;
    boolean isDeveloper;
    int age;
}

你為該模型的一個屬性添加了一個注解,并且向序列化和反序列化傳遞了一個字符串名宴猾。

但這并不是全部圆存!SerializeName接收兩個參數:valuealternate。前者使用了默認的參數仇哆。如果你僅僅傳入了一個字符串沦辙,那么將該字符串設置給valuealternate設置為空值。但是你可以給這兩個參數傳遞值:

public class UserSimpleSerializedName {  
    @SerializedName(value = "fullName", alternate = "username")
    private String name;

    private String email;
    private boolean isDeveloper;
    private int age;
} 

強調一遍讹剔,value改變了序列化和反序列化的默認情況油讯!因此,如果Gson根據你的Java模型類創(chuàng)建了一個JSON延欠,它將會使用value作為該屬性的名陌兑。

alternate僅僅是作為反序列化中的代選項。Gson將會JSON中的所有名稱并且嘗試映射到被注解了的屬性中的某一個由捎。在上面的模型類中兔综,Gson將會檢查到來的JSON中是否含有fullName或者username鸠天。無論是哪一個抽兆,都會映射到name屬性:

{
    'fullName': 'Norman',
    'email': 'norman@futurestud.io'
} 

以及

{
    'username': 'Norman',
    'email': 'norman@futurestud.io'
}

上面兩個JSON會映射到相同的Java對象。

如果有多個域匹配一個屬性,Gson會使用最后一個遇到的域蹲缠。例如费就,在下面的JSON中咖城,name屬性的值將會設置為Marcus十绑,因為該值來的最晚:

{
    'username': 'Norman',
    'fullName': 'Marcus',
    'email': 'norman@futurestud.io'
}

如果你的服務器創(chuàng)建了自相矛盾的JSON,你將不會知道哪個屬性會被匹配慧瘤。

前瞻

在這篇博客中戴已,我們學習了使用@SerializedName去處理多個名稱對應單個屬性的情況。

記住锅减,這僅僅限于反序列化糖儡。Gson會從多個JSON值映射到你的Java對象,但往往會創(chuàng)建在序列化過程中創(chuàng)建相同的JSON上煤。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末休玩,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子劫狠,更是在濱河造成了極大的恐慌拴疤,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件独泞,死亡現場離奇詭異呐矾,居然都是意外死亡,警方通過查閱死者的電腦和手機懦砂,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門蜒犯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荞膘,你說我怎么就攤上這事罚随。” “怎么了羽资?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵淘菩,是天一觀的道長。 經常有香客問我屠升,道長潮改,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任腹暖,我火速辦了婚禮汇在,結果婚禮上,老公的妹妹穿的比我還像新娘脏答。我一直安慰自己糕殉,他們只是感情好亩鬼,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阿蝶,像睡著了一般辛孵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赡磅,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音宝与,去河邊找鬼焚廊。 笑死,一個胖子當著我的面吹牛习劫,可吹牛的內容都是我干的咆瘟。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼诽里,長吁一口氣:“原來是場噩夢啊……” “哼袒餐!你這毒婦竟也來了?” 一聲冷哼從身側響起谤狡,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤灸眼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后墓懂,有當地人在樹林里發(fā)現了一具尸體焰宣,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年捕仔,在試婚紗的時候發(fā)現自己被綠了匕积。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡榜跌,死狀恐怖闪唆,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情钓葫,我是刑警寧澤悄蕾,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站瓤逼,受9級特大地震影響笼吟,放射性物質發(fā)生泄漏。R本人自食惡果不足惜霸旗,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一贷帮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诱告,春花似錦撵枢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜必。三九已至,卻和暖如春沃但,著一層夾襖步出監(jiān)牢的瞬間磁滚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工宵晚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垂攘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓淤刃,卻偏偏與公主長得像晒他,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逸贾,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容

  • 1.概述2.Gson的目標3.Gson的性能和擴展性4.Gson的使用者5.如何使用Gson 通過Maven來使用...
    人失格閱讀 14,223評論 2 18
  • 為了更好的學習Gson陨仅,特將Gson User Guide翻譯如下。由于本人英文水平有限铝侵,如有錯誤灼伤,還請指正,謝謝...
    WeberLisper閱讀 6,785評論 0 6
  • 下午舉行了全鎮(zhèn)第九屆曹彥獎學金評選哟沫,語文試卷是筆者所出饺蔑。考慮是五年級競賽試題嗜诀,筆者從兩個維度選取題型猾警,一類課內外結...
    紅魚兒1閱讀 852評論 0 2
  • 人的記憶真是一個奇怪的東西。在每一天隆敢,甚至每一個瞬間发皿,遇到的大大小小的事情,零零碎碎的感悟拂蝎,在如潮水般的記憶中涌動...
    瀞知閱讀 635評論 4 2
  • 走過了童年的懵懂温自,經歷著青春的迷茫玄货,我們常常思考未來應該怎么走,對未來給予了很多的幻想悼泌,然而當走過了眼前的這條路松捉,...
    永遠不說再見好嗎閱讀 342評論 0 0