@JsonView注解的简单使用
@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来控制传出去,传进来的实体类属性