Springboot使用@JsonView过滤序列化对象属性java
简介:浏览器
@JsonView是Jackson的一个注解,能够用来过滤序列化对象的字段属性,是你能够选择序列化对象哪些属性,哪些过滤掉。app
一、使用接口来声明多个视图测试
二、在值对象的get方法上指定视图this
三、在Controller方法上指定视图spa
使用同一个对象,面对不一样的场景,去声明多个视图。code
例如:xml
有一个User对象,里面有username、password、realname、sex等属性对象
*场景1:得到对象的用户名、密码继承
*场景2:得到对象的所有属性
为了测试,建立一个User实体对象,加入两个接口OneView,TwoView
import java.io.Serializable; public class User implements Serializable{ private static final long serialVersionUID = -218391826213575747L; // 视图1 public interface OneView{}; // 视图2 继承视图1 public interface TwoView extends OneView{}; private String username; private String password; private String realName; private String sex; public User() {} public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
在实体类User里的get方法上面加上@JsonView注解,并将它绑定到一个指定接口
分两类
@JsonView(OneView.class):绑定username、password属性
@JsonView(TwoView.class):绑定realName、sex属性,继承OneView接口(至关于绑了OneView绑定的属性)
import java.io.Serializable; import com.fasterxml.jackson.annotation.JsonView; public class User implements Serializable{ private static final long serialVersionUID = -218391826213575747L; // 视图1 public interface OneView{}; // 视图2 继承视图1 public interface TwoView extends OneView{}; private String username; private String password; private String realName; private String sex; @JsonView(OneView.class) public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonView(OneView.class) public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @JsonView(TwoView.class) public String getRealName() { return realName; } public void setRealName(String realName) { this.realName = realName; } @JsonView(TwoView.class) public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
在controller中俩个方法分别加上@JsonView注解,在分配上不一样场景的接口
user1:输出视图1
user2:输出视图2
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/user1") @JsonView(OneView.class) public User queryUser1() { User user = new User(); user.setUsername("test1"); user.setPassword("123456"); user.setRealName("测试"); user.setSex("男"); return user; } @GetMapping("/user2") @JsonView(TwoView.class) public User queryUser2( String id) { User user = new User(); user.setUsername("test1"); user.setPassword("123456"); user.setRealName("测试"); user.setSex("男"); return user; } }
在浏览器中地址栏输入测试地址
http://localhost:8080/user/user1
http://localhost:8080/user/user2
结果:
user1
user2
说明@OneView只会序列化username、password属性,TwoView会序列化username、password、realName、sex属性。
所以想设置不一样接口的不一样场景,能够用@JsonView达到某些目的。