Spring MVC @JsonView使用詳解

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指定給了idfirstnamelastname三個屬性,這樣,當我們使用@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分兩個規則進行序列化,一個是“基本資料”,即上面那三個屬性的規則;另一個是“詳細資料”,除了包含“基本資料”中的三個屬性外,另外還要包含幾個詳細資料emailaddress

我們在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;
}

可以看到,我們對emailaddress指定了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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,925評論 6 342
  • 本篇文章主要介紹自己在學習Spring MVC常用注解、標簽庫、國際化遇到的一些問題,分享給大家,希望對你有所幫助...
    國士無雙A閱讀 1,587評論 0 17
  • JAVA序列化機制的深入研究 對象序列化的最主要的用處就是在傳遞,和保存對象(object)的時候,保證對象的完整...
    時待吾閱讀 10,907評論 0 24
  • 夜深人靜,忽然很感動,感動冥冥之中緣分注定。感慨,命運讓我總是會在對的時間遇到對的人。 十年了,美好三張的日子里磨...
    張一弘閱讀 141評論 0 0