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.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
网友评论
class Result {
private int code;
private Object obj;
}
然后obj是想要的数据,这时候jsonview直接写到controller上不起作用
@RequestMapping("/user-with-detail")
@JsonView(View.Summary.class)
public List<User> getUsersWithDetail(){
return userService.listUsers();
}
这个应该写成@JsonView(View.SummaryWithDetail.class) 吧??