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