当前位置: 首页 > 科技观察

JavaPojo转Jsoy时如何忽略一些属性

时间:2023-03-12 06:18:48 科技观察

1.前言在Java开发中,有时我们需要屏蔽一些敏感信息,使其不被消费数据的客户端知道。通常我们会设置为null或者一个空字符"",其实还有其他的方法,如果你使用Jackson。接下来,我将通过实际场景向您展示如何操作。2.Jackson如何忽略字段这里我们以JSON序列化为例。如果我们在业务中需要返回用户信息,现有的POJO是这样的:importlombok.Data;/***@authorfelord.cn*/@DatapublicclassUserInfo{/***userid*/privateStringuserId;/***username*/privateStringusername;/***keystring*/privateStringsecret;/***地址信息*/privateStringaddress;}业务场景:第三方通过用户的userId获取用户信息,但是keystringsecret显然不能让第一方三方知道知道最容易想到的方法是将secret字段设置为null或""。如果业务需要批量提供用户信息,也就是List,我们不能每次都遍历。SpringBoot内置的Jackson可以很方便的帮我们处理这个问题。使用@JsonIgnore注解Jackson提供了一个@JsonIgnore注解,标记在需要忽略的字段上或者相应的getter方法或setter方法上,可以实现字段的屏蔽。像这样标记:@JsonIgnoreprivateStringsecret;//对应jsonsample{"userId":"100000","username":"felord.cn","address":"cn"}是否序列化(转POJOJSON)或反序列化((将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")privateStringuserId;2.6版本之后,这个注解也可以实现忽略字段的功能。它有一个access属性,用于指定序列化(“读”)和反序列化(“写”)时的访问权限(这里的读写是从属性的角度)。由枚举Access定义:publicenumAccess{/***无论是序列化还是反序列化,都会根据配置自动处理,默认值。*/AUTO,/***表示该属性只能在序列化期间读取(通过“getter”方法访问值,或从字段中读取),而不能在反序列化期间写入*(设置)。换句话说,这将反映一个“只读的POJO”,其中包含可读但不可写的值。*/READ_ONLY,/***表示该属性只能作为反序列化的一部分进行写入(设置)(使用“setter”方法,或赋值给一个Field,或作为*Creator参数传递),而不会被readFetches(gets)进行序列化,即属性的值不包含在序列化中。*/WRITE_ONLY,/***可读可写,READ_ONLY和WRITE_ONLY的综合作用。*/READ_WRITE;}从这个注解我们可以知道,如果想在POJO转JSON时忽略secret字段,可以这样写:@JsonProperty(access=JsonProperty.Access.WRITE_ONLY)privateStringsecret;使用@JsonIgnoreType来注解这个注解是用来直接忽略类型的。如果上面的UserInfo是另外一个POJO的属性,我们不想让它被序列化和反序列化,那么我们可以:@JsonIgnoreTypepublicclassUserInfo{//省略}3.总结目前已知的Jackson有这四种忽略属性的方式有各自的使用场景,大家可以根据自己的情况选择使用。好了,今天的分享就到这里,多多关注:码农小胖,获取更多编程干货。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。