您好,登錄后才能下訂單哦!
小編給大家分享一下Java開發(fā)中POJO和JSON互轉時怎樣忽略隱藏字段的問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
在Java開發(fā)中有時候某些敏感信息我們需要屏蔽掉,不能被消費這些數(shù)據(jù)的客戶端知道。通常情況下我們會將其設置為null
或者空字符 ""
,其實還有其它辦法,如果你使用了Jackson的話。接下來我將以一個實際場景來告訴你可以怎么做。
這里都以JSON序列化為例。假如我們在業(yè)務中需要返回用戶信息,已有的POJO是這樣的:
import lombok.Data; /** * @author felord.cn */ @Data public class UserInfo { /** * userid */ private String userId; /** * 用戶名 */ private String username; /** * 密鑰串 */ private String secret; /** * 地址信息 */ private String address; }
業(yè)務場景:第三方通過用戶的userId
來獲取用戶的信息,但是密鑰串secret
顯然不能讓第三方知道,通常最容易想到的方法是將secret
字段設置為null
或者""
。如果業(yè)務需要批量提供用戶信息,即List<UserInfo>
,我們總不能每次都要遍歷一遍吧。Spring Boot內(nèi)置的Jackson可以很方便的幫我們處理這個問題。
使用@JsonIgnore注解
Jackson提供了一個@JsonIgnore
注解,將它標記到需要被忽略的字段上或者對應的getter
方法或者setter
方法上就可以實現(xiàn)對該字段的屏蔽。就像下面這樣標記:
@JsonIgnore private String secret; // 對應json 樣例 {"userId":"100000","username":"felord.cn","address":"cn"}
無論是序列化(將POJO轉為JSON)還是反序列化((將JSON轉為POJO),secret
都會被忽略。
使用@JsonIgnoreProperties注解
這個注解比@JsonIgnore
更加強大一些,通常該注解標記到POJO之上,它有更多的能力:
忽略多個字段,配置value
屬性即可。
忽略未知的屬性,配置ignoreUnknown
為true
,默認不忽略。
允許忽略字段被序列化,配置allowGetters
為true
,序列化的時候不會被忽略。
允許忽略字段被反序列化,配置allowSetters
為true
,反序列化的時候不會被忽略。
例如我們要忽略UserInfo
中的secret
和address
,我們可以這樣配置:
@JsonIgnoreProperties({"secret", "address"})
使用@JsonProperty注解
需要Jackson版本不低于2.6
這個注解出鏡率還是非常高的,通常為了給JSON的字段起別名或者設置默認值使用。比如UserInfo
中的userId
想對應JSON中的user_id
,我們可以:
@JsonProperty(value = "user_id") private String userId;
在2.6版本以后,這個注解也能實現(xiàn)忽略字段的作用。它有個access
屬性,用來指定在序列化(“讀取”)和反序列化(“寫”)期間訪問權限(這里的讀寫是以屬性為視角)。它由枚舉Access
定義:
public enum Access { /** * 無論是序列化還是反序列化都會根據(jù)配置自動的處理,默認值。 */ AUTO, /** * 意味著該屬性只能在進行序列化時讀?。ㄍㄟ^“ getter”方法訪問的值,或者從字段中讀?。诜葱蛄谢?nbsp; * 期間不能寫入(設置)。換句話說,這將反映“只讀POJO”,其中包含的值可以讀取但不能寫入。 */ READ_ONLY, /** * 意味著該屬性只能作為反序列化的一部分寫入(設置)(使用“ setter”方法,或分配給Field,或作為 * Creator參數(shù)傳遞),而不會被讀?。ǐ@取)以進行序列化,即,該屬性的值不包括在序列化中。 */ WRITE_ONLY, /** * 可讀可寫,READ_ONLY與WRITE_ONLY的合并效果。 */ READ_WRITE; }
從這個注解中我們可以知道,如果你想在POJO轉JSON時忽略secret
字段,就可以這么寫:
@JsonProperty( access = JsonProperty.Access.WRITE_ONLY) private String secret;
使用@JsonIgnoreType注解
這個注解是用來直接忽略類型的,如果上面的UserInfo
是另外一個POJO的屬性,我們不希望它被序列化和反序列化,那么就可以:
@JsonIgnoreType public class UserInfo { // 省略 }
看完了這篇文章,相信你對“Java開發(fā)中POJO和JSON互轉時怎樣忽略隱藏字段的問題”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。