在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 获取更多资讯