@JsonView注解的使用
简介
- @JsonView是jackson json中的一个注解,Spring MVC也支持这个注解,它的作用就是控制输入输出后的json的属性种类
- @JsonView注解可以将对象的属性分成不同的组,这些组称之为view。view 是开发人员定义的空类/接口。可以根据不同的用途使用不同的 view。可用于序列化和反序列化
- @JsonView可以使用在属性上,也可以使用在类级别上。
举例说明
假设我们有个用户类,其中的属性有用户名和密码。那么通常我们不使用@JsonView注解的时候序列化都是把密码序列化的。但是一般情况我们都不希望密码暴露,但有时候又会想去传输密码。那么现在就需要两种view来进行传输。其中一种只有用户名,另一种在用户名的基础上还包括了密码。
这个是@JsonView注解就很容易的实现这个。
使用一
根据上述的例子,通过@JsonView去实现
-
用户类
@Data @AllArgsConstructor @NoArgsConstructor public class User { // 定义一个接口,表示视图,用户区分属性 public interface UserSimpleView { }; // 第二个接口是在第一个视图上加上了该视图所特有的属性 public interface UserDetailView extends UserSimpleView { }; // 使用@JsonView注解,表示这个属性在哪个视图中 @JsonView(UserSimpleView.class) private String name; @JsonView(UserDetailView.class) private String password; }
-
在controller方法上指定视图
@GetMapping("/findUserBySimpleView") // 在不同情况下使用不同接口 @JsonView(User.UserSimpleView.class) public User findUserBySimpleView(@RequestParam(value="id")String number) { User user=new User(); user.setPassword(number); user.setName("cvzhanshi"); return user; } @JsonView(User.UserDetailView.class) @GetMapping("/findUserByDetailView") public User findUserByDetailView(@RequestParam(value="id")String number) { User user=new User(); user.setPassword(number); user.setName("cvzhanshi"); return user; }
-
结果
-
第一个接口返回值
{ "name": "cvzhanshi" }
-
第二个接口返回值
{ "name": "cvzhanshi", "password": "123" }
-
如此便很轻易的实现了分情况返回视图
使用二
第二种使用方法也是我在工作中看到两句不懂的代码,百度学习到的。刚好也介绍一下。
ObjectMapper om = new ObjectMapper();
om.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
代码示例
- 实体类是使用一相同
public class MainSummaryViewDeserialization {
public static void main(String[] args) throws JsonProcessingException {
User user = new User("cvzhanshi", "123456");
System.out.println("---------------不使用om---------------");
System.out.println(user.toString());
ObjectMapper om = new ObjectMapper();
System.out.println("---------------使用om,不使用view---------------");
String asString = om.writeValueAsString(user);
System.out.println(asString);
om.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
System.out.println("---------------使用om,UserSimpleView,---------------");
String simpleString = om.writerWithView(User.UserSimpleView.class).writeValueAsString(user);
System.out.println(simpleString);
System.out.println("---------------使用om,UserDetailView,---------------");
String detailString = om.writerWithView(User.UserDetailView.class).writeValueAsString(user);
System.out.println(detailString);
}
}
输出结果
---------------不使用om---------------
User(name=cvzhanshi, password=123456)
---------------使用om,不使用view---------------
{"name":"cvzhanshi","password":"123456"}
---------------使用om,UserSimpleView,---------------
{"name":"cvzhanshi"}
---------------使用om,UserDetailView,---------------
{"name":"cvzhanshi","password":"123456"}
总结
不管那种使用方法,它的作用就是控制输入输出后的json的属性种类。通过@JsonView来控制传出去,传进来的实体类属性