• @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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    • 在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;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 结果

      • 第一个接口返回值

        {
            "name": "cvzhanshi"
        }
        
        • 1
        • 2
        • 3
      • 第二个接口返回值

        {
            "name": "cvzhanshi",
            "password": "123"
        }
        
        • 1
        • 2
        • 3
        • 4

    如此便很轻易的实现了分情况返回视图

    使用二

    第二种使用方法也是我在工作中看到两句不懂的代码,百度学习到的。刚好也介绍一下。

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    输出结果

    ---------------不使用om---------------
    User(name=cvzhanshi, password=123456)
    ---------------使用om,不使用view---------------
    {"name":"cvzhanshi","password":"123456"}
    ---------------使用om,UserSimpleView,---------------
    {"name":"cvzhanshi"}
    ---------------使用om,UserDetailView,---------------
    {"name":"cvzhanshi","password":"123456"}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    总结

    不管那种使用方法,它的作用就是控制输入输出后的json的属性种类。通过@JsonView来控制传出去,传进来的实体类属性

  • 相关阅读:
    uniapp微信小程序 隐藏顶部导航栏 路由跳转带参数
    设计模式-观察者模式(Observer Pattern)结构|原理|优缺点|场景|示例
    milvus 迅速搭建
    用VS开发一款“飞机大战“单机游戏<C++>
    【C++学习笔记】内联函数
    React和vue等前端html页面引入自定义字体文件,更改页面字体样式
    MySQL性能优化——MYSQL执行流程
    【k8s】(四)kubernetes1.29.4离线部署之-组件安装
    java - lua - redis 完成商品库存的删减
    AI时代项目经理与架构师的成长之道:ChatGPT让你插上翅膀
  • 原文地址:https://blog.csdn.net/qq_45408390/article/details/127402177