Spring MVC @JsonView注解使用

@JsonView注解用来过滤序列化对象的字段属性,简单来说就是定义一个标签,根据controller的JsonView属性,将实体类中不同标签的属性进行分类显示。

例: 首先定义一个view类,有两个接口Summary 和SummaryWithDetail :

public class View {
          
   
   public interface Summary {
          
   }
   public interface SummaryWithDetail extends Summary{
          
   }
}
    1 2 3 4

然后定义一个实体类User,选择属性分别加上注解@JsonView(View.Summary.class) 或@JsonView(View.SummaryWithDetail .class)

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;

  ...
}
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

定义Controller类,加上@JsonView注解:

@RestController
public class UserRestController{
          
   
  @Autowired 
  private UserService userService;

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

  @RequestMapping("/userWithDetail")
  @JsonView(View.SummaryWithDetail.class) 
  public List<User> getUsersWithDetail(){
    return userService.listUsers();
  }
}
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

访问/user时,使用的注解是@JsonView(View.Summary.class),所以仅显示注解为@JsonView(View.Summary.class)的属性,结果为:

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

访问/userWithDetail时,使用的注解是@JsonView(View.SummaryWithDetail.class),结果显示注解为@JsonView(View.SummaryWithDetail.class)的属性,同时由于SummaryWithDetail继承于Summary,结果也包含注解为@JsonView(View.Summary.class)的属性,结果为:

[ { “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” } ]
经验分享 程序员 微信小程序 职场和发展