扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“怎么再Java Pojo转Jsoy时忽略掉一些属性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为成县企业提供专业的网站制作、成都网站制作,成县网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。
1. 前言
在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。通常情况下我们会将其设置为null或者空字符"",其实还有其它办法,如果你使用了Jackson的话。接下来我将以一个实际场景来告诉你可以怎么做。
2. Jackson 如何忽略字段
这里都以 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
使用@JsonIgnore 注解
Jackson提供了一个@JsonIgnore注解,将它标记到需要被忽略的字段上或者对应的getter方法或者setter方法上就可以实现对该字段的屏蔽。就像下面这样标记:
@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 版本以后,这个注解也能实现忽略字段的作用。它有个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;
使用@JsonIgnoreType 注解
这个注解是用来直接忽略类型的,如果上面的UserInfo是另外一个 POJO 的属性,我们不希望它被序列化和反序列化,那么就可以:
@JsonIgnoreType public class UserInfo { // 省略 }
“怎么再Java Pojo转Jsoy时忽略掉一些属性”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流