Spring MVC @JsonView使用详解

作者: Devid | 来源:发表于2015-12-16 11:17 被阅读3993次

    Spring 提供了对Jackson 非常好的支持,可以查看此spring-jackson-demo代码来掌握。这里着重说一下@JsonView的用法

    JSON Views 基本用法

    @JsonView可以过滤序列化对象的字段属性,可以使你有选择的序列化对象。下面看一个例子:
    首先我们定义一个View类,里面包含我们对“要序列化的字段”的定义,我们暂时归为Summary(摘要)。属于Summary的字段都是我们要序列化的字段。

    这里也可以将View类理解为一组“标识”,而Summary就是其中的一个“标识”。

    public class View {
       interface Summary {}
    }
    

    View类的定义很简单。

    然后我们定义我们的Bean类:User

    public class User { 
      @JsonView(View.Summary.class) 
      private Long id; 
      @JsonView(View.Summary.class) 
      private String firstname; 
      @JsonView(View.Summary.class) 
      private String lastname; 
      private String email; 
      private String address; 
      private String postalCode; 
      private String city; 
      private String country;
    }
    

    可以看到,@JsonView使用很简单,加在属性上,指定一个“标识”就好了。上面例子我们将Summary指定给了idfirstnamelastname三个属性,这样,当我们使用@JsonView序列化User对象的时候,就只会序列化这三个属性,可以隐藏一些不想序列化的字段属性。
    SpringMVC根据@JsonView序列化的方法如下:

    @RestController
    public class UserRestController{
      @Autowired 
      private UserService userService;
    
      @RequestMapping("/user")
      @JsonView(View.Summary.class) 
      public List<User> getUsers(){
        return userService.listUsers();
      }
    }
    

    在Controller中指定JsonVIew即可。
    当我们访问/user时,会得到如下结果:

    [
      { "id" : 1, "firstname" : "Brian", "lastname" : "Clozel" },
      { "id" : 2, "firstname" : "Stéphane", "lastname" : "Nicoll" },
      { "id" : 3, "firstname" : "Rossen", "lastname" : "Stoyanchev" }
    ]
    

    用法是不是很简单?

    JSON Views 继承用法

    JsonView 同时还支持继承
    比如我们需要将User分两个规则进行序列化,一个是“基本资料”,即上面那三个属性的规则;另一个是“详细资料”,除了包含“基本资料”中的三个属性外,另外还要包含几个详细资料emailaddress

    我们在View中再加一个“标识”SummaryWithDetail,定义如下:

    public class View {
      interface Summary {}
      interface SummaryWithDetail extends Summary{}
    }
    

    这里使用了继承,SummaryWithDetail继承了Summary,也就是说,当我们以SummaryWithDetail的方式进行对象序列化时,出来的属性同时也包含Summary指定的属性。我们在User中指定SummaryWithDetail:

    public class User { 
      @JsonView(View.Summary.class) 
      private Long id; 
      @JsonView(View.Summary.class) 
      private String firstname; 
      @JsonView(View.Summary.class) 
      private String lastname; 
    
      @JsonView(View.SummaryWithDetail .class) 
      private String email; 
      @JsonView(View.SummaryWithDetail .class) 
      private String address; 
    
      private String postalCode; 
      private String city; 
      private String country;
    }
    

    可以看到,我们对emailaddress指定了SummaryWithDetail标识。

    增加Controller方法,测试:

    @RestController
    public class UserRestController{
      @Autowired 
      private UserService userService;
    
      @RequestMapping("/user")
      @JsonView(View.Summary.class) 
      public List<User> getUsers(){
        return userService.listUsers();
      }
    
      @RequestMapping("/user-with-detail")
      @JsonView(View.SummaryWithDetail.class) 
      public List<User> getUsersWithDetail(){
        return userService.listUsers();
      }
    }
    

    这样,当我们访问/user-with-detail时,会得到如下结果:

    [
      { 
        "id" : 1, 
        "firstname" : "Brian", 
        "lastname" : "Clozel", 
        "email": "brian@163.com", 
        "address": "beijing China" 
      },
      { 
        "id" : 2, 
        "firstname" : "Stéphane", 
        "lastname" : "Nicoll", 
        "email": "nicoll@163.com", 
        "address": "beijing China" 
       },
      { 
        "id" : 3, 
        "firstname" : "Rossen", 
        "lastname" : "Stoyanchev" , 
        "email": "stoyanchev@163.com", 
        "address": "beijing China" 
      }
    ]
    

    其实要想实现对属性的排除过滤,Jackson还有一种更简单的方法:@JsonFilter
    官方文档地址:http://wiki.fasterxml.com/JacksonFeatureJsonFilter

    相关文章

      网友评论

      • 编程界的小学生:如果返回的是一个封装好的Result呢?
        class Result {
        private int code;
        private Object obj;
        }
        然后obj是想要的数据,这时候jsonview直接写到controller上不起作用
        Pencilso:请问是否解决了?
        Pencilso:我也碰到这个问题了
        汪作新:对象的属性必须是数据类型吧
      • 一个战士:是不是写错了?还是我理解错了。
        @RequestMapping("/user-with-detail")
        @JsonView(View.Summary.class)
        public List<User> getUsersWithDetail(){
        return userService.listUsers();
        }

        这个应该写成@JsonView(View.SummaryWithDetail.class) 吧??
        Devid:谢谢提醒!
        fd3feedff3b4:我也觉得可能写错了:smile:

      本文标题:Spring MVC @JsonView使用详解

      本文链接:https://www.haomeiwen.com/subject/zsouhttx.html