Spring MVC @JsonView使用详解

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

@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指定给了id、firstname、lastname三个属性,这样,当我们使用@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" }

]


用法是不是很简单?
JsonView 同时还支持继承 
比如我们需要将User分两个规则进行序列化,一个是“基本资料”,即上面那三个属性的规则;另一个是“详细资料”,除了包含“基本资料”中的三个属性外,另外还要包含几个详细资料email、address。
我们在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;
}

可以看到,我们对email和address指定了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.Summary.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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值