@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来控制传出去,传进来的实体类属性

经验分享 程序员 微信小程序 职场和发展