1. 前言
在java開發中有時候某些敏感信息我們需要屏蔽掉,不能被消費這些數據的客戶端知道。通常情況下我們會將其設置為null
或者空字符 ""
,其實還有其它辦法,如果你使用了jackson的話。接下來我將以一個實際場景來告訴你可以怎么做。
2. jackson如何忽略字段
這里都以json序列化為例。假如我們在業務中需要返回用戶信息,已有的pojo是這樣的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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可以很方便的幫我們處理這個問題。
使用@jsonignore注解
jackson提供了一個@jsonignore
注解,將它標記到需要被忽略的字段上或者對應的getter
方法或者setter
方法上就可以實現對該字段的屏蔽。就像下面這樣標記:
1
2
3
|
@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
,我們可以這樣配置:
1
|
@jsonignoreproperties ({ "secret" , "address" }) |
使用@jsonproperty注解
需要jackson版本不低于2.6
這個注解出鏡率還是非常高的,通常為了給json的字段起別名或者設置默認值使用。比如userinfo
中的userid
想對應json中的user_id
,我們可以:
1
2
|
@jsonproperty (value = "user_id" ) private string userid; |
在2.6版本以后,這個注解也能實現忽略字段的作用。它有個access
屬性,用來指定在序列化(“讀取”)和反序列化(“寫”)期間訪問權限(這里的讀寫是以屬性為視角)。它由枚舉access
定義:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public enum access { /** * 無論是序列化還是反序列化都會根據配置自動的處理,默認值。 */ auto, /** * 意味著該屬性只能在進行序列化時讀取(通過“ getter”方法訪問的值,或者從字段中讀取),而在反序列化 * 期間不能寫入(設置)。換句話說,這將反映“只讀pojo”,其中包含的值可以讀取但不能寫入。 */ read_only, /** * 意味著該屬性只能作為反序列化的一部分寫入(設置)(使用“ setter”方法,或分配給field,或作為 * creator參數傳遞),而不會被讀取(獲取)以進行序列化,即,該屬性的值不包括在序列化中。 */ write_only, /** * 可讀可寫,read_only與write_only的合并效果。 */ read_write; } |
從這個注解中我們可以知道,如果你想在pojo轉json時忽略secret
字段,就可以這么寫:
1
2
|
@jsonproperty ( access = jsonproperty.access.write_only) private string secret; |
使用@jsonignoretype注解
這個注解是用來直接忽略類型的,如果上面的userinfo
是另外一個pojo的屬性,我們不希望它被序列化和反序列化,那么就可以:
1
2
3
4
|
@jsonignoretype public class userinfo { // 省略 } |
3. 總結
目前大概可知的jackson有這么四種的忽略屬性的方式,它們有各自的使用場景,你可以根據自己的情況選擇使用。
到此這篇關于java開發中pojo和json互轉時如何忽略隱藏字段的問題的文章就介紹到這了,更多相關java中pojo和json互轉內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!