Gson——如何忽略用@Expose標(biāo)記的字段

原文鏈接:Gson Model Annotations — How to Ignore Fields with @Expose

作者:Norman Peitek

翻譯:簽到錢就到

在我們之前的幾篇Gson的博客,我們總是假設(shè)你要(反)序列化一個模型中的所有屬性。那可能不符合所有情況。如果你想要自定義(反)序列化,請繼續(xù)閱讀!

當(dāng)然,這不是我們Gson系列里唯一的一篇文章,如果你對其他的主題感興趣,可以看一下我們的大綱:

Gson系列概覽

  1. 用java-JSON實現(xiàn)序列化合反序列化
  2. 嵌套對象的映射
  3. 數(shù)組和列表對象的映射
  4. Map的映射
  5. Set的映射
  6. 空值的映射
  7. Gson 模型注釋 — 如何忽略用@Expose標(biāo)記的字段
  8. Gson Model Annotations — How to Change the Naming of Fields with @SerializedName
  9. Gson Builder — Basics & Naming Policies
  10. Gson Builder — Force Serialization of null Values
  11. Gson Builder — Exclusion Strategies
  12. Gson Builder — Relax Gson with Lenient
  13. Gson Builder — Special Values of Floats & Doubles
  14. Gson Builder — Model Versioning
  15. Gson Builder — Formatting of Dates & Custom Date/Time Mapping
  16. Gson Builder — Pretty Printing
  17. 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ù):serializedeserialize。默認(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
}

上面的例子的在序列化過程中只有nameisDeveloper標(biāo)簽會在JSON中顯示。其它的兩個字段,即使它們設(shè)置了,也不會被轉(zhuǎn)換。

另一方面,反序列化,Java對象也只有JSON中的nameage字段,emailisDeveloper將會被忽略。

添加@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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容