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

猜你喜欢

转载自blog.csdn.net/qq_45408390/article/details/127402177
今日推荐