在Java開發中有時候某些敏感信息咱們須要屏蔽掉,不能被消費這些數據的客戶端知道。一般狀況下咱們會將其設置爲null
或者空字符 ""
,其實還有其它辦法,若是你使用了Jackson的話。接下來我將以一個實際場景來告訴你能夠怎麼作。java
這裏都以JSON序列化爲例。假如咱們在業務中須要返回用戶信息,已有的POJO是這樣的:編程
import lombok.Data; /** * @author felord.cn */ @Data public class UserInfo { /** * userid */ private String userId; /** * 用戶名 */ private String username; /** * 密鑰串 */ private String secret; /** * 地址信息 */ private String address; }
業務場景:第三方經過用戶的userId
來獲取用戶的信息,可是密鑰串secret
顯然不能讓第三方知道,一般最容易想到的方法是將secret
字段設置爲null
或者""
。若是業務須要批量提供用戶信息,即List<UserInfo>
,咱們總不能每次都要遍歷一遍吧。Spring Boot內置的Jackson能夠很方便的幫咱們處理這個問題。json
Jackson提供了一個@JsonIgnore
註解,將它標記到須要被忽略的字段上或者對應的getter
方法或者setter
方法上就能夠實現對該字段的屏蔽。就像下面這樣標記:jsonp
@JsonIgnore private String secret; // 對應json 樣例 {"userId":"100000","username":"felord.cn","address":"cn"}
不管是序列化(將POJO轉爲JSON)仍是反序列化((將JSON轉爲POJO),secret
都會被忽略。3d
這個註解比@JsonIgnore
更增強大一些,一般該註解標記到POJO之上,它有更多的能力:code
value
屬性便可。ignoreUnknown
爲true
,默認不忽略。allowGetters
爲true
,序列化的時候不會被忽略。allowSetters
爲true
,反序列化的時候不會被忽略。例如咱們要忽略UserInfo
中的secret
和address
,咱們能夠這樣配置:blog
@JsonIgnoreProperties({"secret", "address"})
須要Jackson版本不低於2.6開發
這個註解出鏡率仍是很是高的,一般爲了給JSON的字段起別名或者設置默認值使用。好比UserInfo
中的userId
想對應JSON中的user_id
,咱們能夠:get
@JsonProperty(value = "user_id") private String userId;
在2.6版本之後,這個註解也能實現忽略字段的做用。它有個access
屬性,用來指定在序列化(「讀取」)和反序列化(「寫」)期間訪問權限(這裏的讀寫是以屬性爲視角)。它由枚舉Access
定義:博客
public enum Access { /** * 不管是序列化仍是反序列化都會根據配置自動的處理,默認值。 */ AUTO, /** * 意味着該屬性只能在進行序列化時讀取(經過「 getter」方法訪問的值,或者從字段中讀取),而在反序列化 * 期間不能寫入(設置)。換句話說,這將反映「只讀POJO」,其中包含的值能夠讀取但不能寫入。 */ READ_ONLY, /** * 意味着該屬性只能做爲反序列化的一部分寫入(設置)(使用「 setter」方法,或分配給Field,或做爲 * Creator參數傳遞),而不會被讀取(獲取)以進行序列化,即,該屬性的值不包括在序列化中。 */ WRITE_ONLY, /** * 可讀可寫,READ_ONLY與WRITE_ONLY的合併效果。 */ READ_WRITE; }
從這個註解中咱們能夠知道,若是你想在POJO轉JSON時忽略secret
字段,就能夠這麼寫:
@JsonProperty( access = JsonProperty.Access.WRITE_ONLY) private String secret;
這個註解是用來直接忽略類型的,若是上面的UserInfo
是另一個POJO的屬性,咱們不但願它被序列化和反序列化,那麼就能夠:
@JsonIgnoreType public class UserInfo { // 省略 }
目前大概可知的Jackson有這麼四種的忽略屬性的方式,它們有各自的使用場景,你能夠根據本身的狀況選擇使用。好了今天的分享就到這裏,多多關注:碼農小胖哥,獲取更多的編程乾貨。
關注公衆號:Felordcn 獲取更多資訊