如何再Java Pojo转Jsoy时忽略掉一些属性

开发 后端
在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。

[[379614]]

 1. 前言

在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。通常情况下我们会将其设置为null或者空字符"",其实还有其它办法,如果你使用了Jackson的话。接下来我将以一个实际场景来告诉你可以怎么做。

2. Jackson 如何忽略字段

这里都以 JSON 序列化为例。假如我们在业务中需要返回用户信息,已有的 POJO 是这样的:

  1. import lombok.Data; 
  2.  
  3. /** 
  4.  * @author felord.cn 
  5.  */ 
  6. @Data 
  7. public class UserInfo { 
  8.     /** 
  9.      * userid 
  10.      */ 
  11.     private String userId; 
  12.     /** 
  13.      * 用户名 
  14.      */ 
  15.     private String username; 
  16.     /** 
  17.      * 密钥串 
  18.      */ 
  19.     private String secret; 
  20.     /** 
  21.      * 地址信息 
  22.      */ 
  23.     private String address; 

业务场景:第三方通过用户的userId来获取用户的信息,但是密钥串secret显然不能让第三方知道,通常最容易想到的方法是将secret字段设置为null或者""。如果业务需要批量提供用户信息,即List,我们总不能每次都要遍历一遍吧。Spring Boot内置的Jackson可以很方便的帮我们处理这个问题。

使用@JsonIgnore 注解

Jackson提供了一个@JsonIgnore注解,将它标记到需要被忽略的字段上或者对应的getter方法或者setter方法上就可以实现对该字段的屏蔽。就像下面这样标记:

  1. @JsonIgnore 
  2.  private String secret; 
  3. // 对应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. @JsonProperty(value = "user_id"
  2. private String userId; 

在 2.6 版本以后,这个注解也能实现忽略字段的作用。它有个access属性,用来指定在序列化(“读取”)和反序列化(“写”)期间访问权限(这里的读写是以属性为视角)。它由枚举Access定义:

  1. public enum Access 
  2.     /** 
  3.      * 无论是序列化还是反序列化都会根据配置自动的处理,默认值。 
  4.      */ 
  5.     AUTO, 
  6.  
  7.     /** 
  8.      * 意味着该属性只能在进行序列化时读取(通过“ getter”方法访问的值,或者从字段中读取),而在反序列化      * 期间不能写入(设置)。换句话说,这将反映“只读POJO”,其中包含的值可以读取但不能写入。 
  9.      */ 
  10.     READ_ONLY, 
  11.  
  12.     /** 
  13.      * 意味着该属性只能作为反序列化的一部分写入(设置)(使用“ setter”方法,或分配给Field,或作为          * Creator参数传递),而不会被读取(获取)以进行序列化,即,该属性的值不包括在序列化中。 
  14.      */ 
  15.     WRITE_ONLY, 
  16.  
  17.     /** 
  18.      * 可读可写,READ_ONLY与WRITE_ONLY的合并效果。 
  19.      */ 
  20.     READ_WRITE; 

从这个注解中我们可以知道,如果你想在POJO转JSON时忽略secret字段,就可以这么写:

  1. @JsonProperty( access = JsonProperty.Access.WRITE_ONLY) 
  2. private String secret; 

使用@JsonIgnoreType 注解

这个注解是用来直接忽略类型的,如果上面的UserInfo是另外一个 POJO 的属性,我们不希望它被序列化和反序列化,那么就可以:

  1. @JsonIgnoreType 
  2. public class UserInfo { 
  3.    // 省略 

3. 总结

目前大概可知的 Jackson 有这么四种的忽略属性的方式,它们有各自的使用场景,你可以根据自己的情况选择使用。好了今天的分享就到这里,多多关注:码农小胖哥,获取更多的编程干货。

本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。

 

责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2023-10-25 13:37:04

Git

2009-06-22 15:36:00

如何学好java

2022-03-02 08:01:31

面试前端开发

2012-09-25 10:03:56

JavaJava封面Java开发

2011-06-01 16:50:21

JAVA

2020-05-19 08:06:57

代码重构代码开发

2011-06-02 10:04:53

CSS

2021-04-25 09:30:52

开发CSS 浏览器

2010-07-21 14:33:27

SQL Server

2009-06-04 09:14:32

struts学习struts常用属性

2012-09-11 09:16:52

Hadoop

2009-06-18 09:51:25

Java继承

2009-07-09 13:16:54

Java Swing开

2020-10-29 08:39:45

JSONJava对象

2015-08-24 09:26:18

Java内存问题见解

2015-12-08 09:05:41

Java内部类

2024-10-10 08:51:15

2016-12-07 09:38:53

SparkMapReduce

2011-03-11 09:27:11

Java性能监控

2021-06-18 07:35:46

Java接口应用
点赞
收藏

51CTO技术栈公众号