原文鏈接:Gson Model Annotations — How to Ignore Fields with @Expose
翻譯:簽到錢就到
在我們之前的幾篇Gson的博客,我們總是假設(shè)你要(反)序列化一個模型中的所有屬性。那可能不符合所有情況。如果你想要自定義(反)序列化柱搜,請繼續(xù)閱讀佣渴!
當(dāng)然,這不是我們Gson系列里唯一的一篇文章桂肌,如果你對其他的主題感興趣数焊,可以看一下我們的大綱:
Gson系列概覽
- 用java-JSON實(shí)現(xiàn)序列化合反序列化
- 嵌套對象的映射
- 數(shù)組和列表對象的映射
- Map的映射
- Set的映射
- 空值的映射
- Gson 模型注釋 — 如何忽略用@Expose標(biāo)記的字段
- Gson Model Annotations — How to Change the Naming of Fields with @SerializedName
- Gson Builder — Basics & Naming Policies
- Gson Builder — Force Serialization of null Values
- Gson Builder — Exclusion Strategies
- Gson Builder — Relax Gson with Lenient
- Gson Builder — Special Values of Floats & Doubles
- Gson Builder — Model Versioning
- Gson Builder — Formatting of Dates & Custom Date/Time Mapping
- Gson Builder — Pretty Printing
- Gson Builder — HTML Escaping
模型注釋@Expose
讀了上篇關(guān)于空值處理的文章,你應(yīng)該想到當(dāng)你不想要在JSON中顯示的時候,應(yīng)該為這個Java字段設(shè)置null
崎场。尤其是當(dāng)你不想要通過網(wǎng)絡(luò)傳遞私有或敏感數(shù)據(jù)時佩耳,如何處理很關(guān)鍵。不過谭跨,不用擔(dān)心干厚,Gson提供了一個簡單的注釋@Expose
來解決。
@Expose
是一個可選的螃宙,提供兩個配置參數(shù):serialize
和deserialize
蛮瞄。默認(rèn)情況下所有的都是設(shè)置為true
。這樣谆扎,如果你不用@Expose
去增強(qiáng)字段挂捅,像我們第一篇博客里一樣,所有的將會被包括在里面燕酷。如果你設(shè)置了@Expose
籍凝,但也沒有設(shè)置某個特定的值為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
}
上面的例子的在序列化過程中只有name
和isDeveloper
標(biāo)簽會在JSON中顯示。其它的兩個字段酱讶,即使它們設(shè)置了退盯,也不會被轉(zhuǎn)換。
另一方面泻肯,反序列化渊迁,Java對象也只有JSON中的name
和age
字段,email
和isDeveloper
將會被忽略灶挟。
添加@Expose
是一個非常簡單的控制哪些要被(反)序列化的方式琉朽。我們建議如果需要所有的都被轉(zhuǎn)化,就不用添加@Expose
了稚铣。不然只會搞亂你的模型類箱叁。
transient
相對于使用@Expose
墅垮,另一個方案是使用transient
,一個transient
字段不會(反)被序列化耕漱。然而算色,你沒有像@Expose
一樣的完全控制權(quán)。你不能只一個方向激活螟够,transient
會為那個屬性永久地關(guān)閉轉(zhuǎn)換:
public class UserSimple {
String name;
String email;
int age;
boolean transient isDeveloper; // will not be serialized or deserialized
}
展望
這篇文章中灾梦,你學(xué)會了在(反)序列化過程中如何配置@Expose
去包括和去除模型屬性。你可能在日常工作中需要用到這個妓笙,所以若河,確保正確理解它。
如果你需要反饋或有疑問,在評論中讓我們知道或twitter @futurestud_io给郊。