您的位置:首页 > 编程语言 > Java开发

Spring MVC @JsonView使用详解

2015-12-16 15:22 459 查看
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
指定给了
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" }
]


用法是不是很简单?

JSON Views 继承用法

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息