Loading... ## 1. 前言 在**Java** 开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。通常情况下我们会将其设置为`null`或者空字符`""`,其实还有其它办法,如果你使用了**Jackson** 的话。接下来我将以一个实际场景来告诉你可以怎么做。 ## 2. Jackson如何忽略字段 这里都以JSON序列化为例。假如我们在业务中需要返回用户信息,已有的POJO是这样的: ```java hljs 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`方法上就可以实现对该字段的屏蔽。就像下面这样标记: ```java hljs @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`,我们可以这样配置: ```java hljs @JsonIgnoreProperties({"secret", "address"}) ``` ### 使用@JsonProperty注解 > 需要Jackson版本不低于2.6 这个注解出镜率还是非常高的,通常为了给**JSON** 的字段起别名或者设置默认值使用。比如`UserInfo`中的`userId`想对应**JSON** 中的`user_id`,我们可以: ```java hljs @JsonProperty(value = "user_id") private String userId; ``` 在2.6版本以后,这个注解也能实现忽略字段的作用。它有个`access`属性,用来指定在序列化(“读取”)和反序列化(“写”)期间访问权限(**这里的读写是以属性为视角** )。它由枚举`Access`定义: ```java hljs public enum Access { /** * 无论是序列化还是反序列化都会根据配置自动的处理,默认值。 */ AUTO, /** * 意味着该属性只能在进行序列化时读取(通过“ getter”方法访问的值,或者从字段中读取),而在反序列化 * 期间不能写入(设置)。换句话说,这将反映“只读POJO”,其中包含的值可以读取但不能写入。 */ READ_ONLY, /** * 意味着该属性只能作为反序列化的一部分写入(设置)(使用“ setter”方法,或分配给Field,或作为 * Creator参数传递),而不会被读取(获取)以进行序列化,即,该属性的值不包括在序列化中。 */ WRITE_ONLY, /** * 可读可写,READ_ONLY与WRITE_ONLY的合并效果。 */ READ_WRITE; } ``` 从这个注解中我们可以知道,如果你想在**POJO** 转**JSON** 时忽略`secret`字段,就可以这么写: ```java hljs @JsonProperty( access = JsonProperty.Access.WRITE_ONLY) private String secret; ``` ## 使用@JsonIgnoreType注解 这个注解是用来直接忽略类型的,如果上面的`UserInfo`是另外一个POJO的属性,我们不希望它被序列化和反序列化,那么就可以: ```java hljs @JsonIgnoreType public class UserInfo { // 省略 } ``` ## 3. 总结 目前大概可知的Jackson有这么四种的忽略属性的方式,它们有各自的使用场景,你可以根据自己的情况选择使用 最后修改:2021 年 08 月 17 日 © 允许规范转载 打赏 赞赏作者 微信 赞 0 如果觉得我的文章对你有用,请随意赞赏
此处评论已关闭