SpringBoot定制JSON響應(yīng)數(shù)據(jù)返回的示例代碼
一、前言
目前微服務(wù)項目中RESTful API已經(jīng)是前后端對接數(shù)據(jù)格式的標(biāo)配模式了,RESTful API是一種基于REST(Representational State Transfer,表述性狀態(tài)轉(zhuǎn)移)原則的應(yīng)用程序編程接口(Application Programming Interface),它主要用于Web服務(wù)之間的數(shù)據(jù)交互。RESTful API的設(shè)計遵循一些核心原則,這些原則使得API更加簡潔、靈活和可擴展。
在構(gòu)建這些API時,我們往往需要根據(jù)不同的客戶端、用戶角色或業(yè)務(wù)需求,靈活地控制返回的數(shù)據(jù)結(jié)構(gòu)和內(nèi)容。Jackson庫的@JsonView注解為我們提供了一種優(yōu)雅且高效的方式來實現(xiàn)這一目標(biāo)。
二、問題場景
@JsonView 是 Jackson 庫中的一個注解,它允許你定義哪些屬性應(yīng)該被序列化到 JSON 中,基于不同的“視圖”或“配置”。這在某些情況下非常有用,特別是當(dāng)你想要為不同的用戶或API端點返回不同級別的詳細信息時。
例如,你可能有一個User對象,其中包含多個屬性,如id、name、email和password。當(dāng)你為外部API或網(wǎng)站前端返回用戶數(shù)據(jù)時,你可能不希望包含password字段。但是,在內(nèi)部API或某些特定的情況下,你可能想要返回包含password的完整用戶對象。
這就是@JsonView可以幫助你的地方。你可以定義一個或多個“視圖”類,并為你的屬性指定應(yīng)該出現(xiàn)在哪些視圖中。
在本文中,通過了解@JsonView,你將能夠更好地掌握如何在Spring Boot應(yīng)用中定制JSON數(shù)據(jù)的輸出,從而提供更加靈活、安全且高效的RESTful API服務(wù)。
三、@JsonView主要應(yīng)用場景
主要應(yīng)用場景包括:
1.數(shù)據(jù)脫敏:在某些情況下,你可能不希望將數(shù)據(jù)庫中的某些敏感信息(如密碼、密鑰等)暴露給客戶端。通過使用 @JsonView,你可以定義哪些字段應(yīng)該被包含在特定的視圖中,并在返回數(shù)據(jù)時僅包含這些字段。
2.自定義數(shù)據(jù)輸出:你可以根據(jù)客戶端的需求或權(quán)限級別,定義不同的視圖,并在返回數(shù)據(jù)時根據(jù)當(dāng)前視圖的配置來輸出不同的字段組合。
四、代碼實戰(zhàn)
1. 定義實體類
package com.example.yddemo.JSONView; import com.fasterxml.jackson.annotation.JsonView; public class User { @JsonView(Views.Public.class) private Long id; @JsonView(Views.Public.class) private String name; @JsonView(Views.Internal.class) private String email; @JsonView(Views.Internal.class) private String password; public User(Long id, String name, String email, String password) { this.id = id; this.name = name; this.email = email; this.password = password; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", password='" + password + '\'' + '}'; } }
2. 定義視圖控制器
public class Views { public static class Public { } public static class Internal extends Public { } }
3. 在代碼中使用,添加@JsonView注解
package com.example.yddemo.JSONView; import com.fasterxml.jackson.annotation.JsonView; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestDemoController { @GetMapping("/user/Public") @JsonView(Views.Public.class) public User userPublic() { User user = new User(1L, "Tom", "123123@163.com", "123456") ; return user ; } @GetMapping("/user/Internal") @JsonView(Views.Internal.class) public User userInternal() { User user = new User(1L, "Tom", "123123@163.com", "123456") ; return user; } }
輸出結(jié)果
不想使用在Controller接口上使用@JsonView注解方式,你還可以通過編程的方式控制,通過ObjectMapper類也能方便的控制json輸出。
@GetMapping("/user/all/public") public String userAllPublic() { ObjectMapper mapper = new ObjectMapper(); User user = new User(1L, "Tom", "123123@163.com", "123456") ; String publicJson; try { publicJson = mapper.writerWithView(Views.Public.class).writeValueAsString(user); } catch (JsonProcessingException e) { throw new RuntimeException(e); } return publicJson; } @GetMapping("/user/all/internal") public String userAllInternal() { ObjectMapper mapper = new ObjectMapper(); User user = new User(1L, "Tom", "123123@163.com", "123456") ; String internalJson; try { internalJson = mapper.writerWithView(Views.Internal.class).writeValueAsString(user); } catch (JsonProcessingException e) { throw new RuntimeException(e); } return internalJson; }
輸出結(jié)果
通過@JsonView的代碼展示思考一個問題?
如果沒有該注解你會通過什么方式實現(xiàn)?針對不同的場景定義不同的DTO?通過@JsonIgnore注解?
定義不同的DTO太麻煩,代碼大量冗余。使用@JsonIgnore注解所有的接口都將會忽略該字段,不能精準控制單個API接口。所以整體上看還是使用@JsonView更加的靈活。
五、總結(jié)
@JsonView 與 @JsonIgnore 區(qū)別
①. @JsonView 用于控制序列化時的字段組合,允許你根據(jù)不同的視圖返回不同的字段集合。
②. @JsonIgnore 則簡單地忽略某個字段,使其在序列化時不會被包含在 JSON 中。
最后@JsonView 提供了一種靈活且強大的方式來控制序列化的 JSON 數(shù)據(jù)。通過定義視圖和將它們應(yīng)用到屬性和控制器方法上,你可以根據(jù)需要暴露不同級別的數(shù)據(jù),實現(xiàn) API 的數(shù)據(jù)定制化。
以上就是SpringBoot定制JSON響應(yīng)數(shù)據(jù)返回的示例代碼的詳細內(nèi)容,更多關(guān)于SpringBoot定制JSON數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringMVC前端和后端數(shù)據(jù)交互總結(jié)
本篇文章主要介紹了SpringMVC前端和后端數(shù)據(jù)交互總結(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03Spring Boot如何實現(xiàn)定時任務(wù)的動態(tài)增刪啟停詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何實現(xiàn)定時任務(wù)的動態(tài)增刪啟停的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權(quán)認證
Spring Security是一個可以為Java應(yīng)用程序提供全面安全服務(wù)的框架,同時它也可以輕松擴展以滿足自定義需求,本文主要介紹了SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權(quán)認證,感興趣的可以了解一下2023-11-11SpringBoot優(yōu)化啟動速度的方法實現(xiàn)
本篇文章主要介紹了SpringBoot優(yōu)化啟動速度的方法實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例
這篇文章主要介紹了Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法,結(jié)合實例形式分析了java創(chuàng)建微信公眾號自定義菜單的具體步驟、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-10-10詳解Java中NullPointerException的處理方法
這篇文章將帶大家來單獨看一個很常見的異常--空指針異常,這個可以說是每個Java程序員都必知的異常,所以我們不得不單獨學(xué)習(xí)一下,文中有詳細的代碼示例,需要的朋友可以參考下2023-08-08@PathParam和@QueryParam區(qū)別簡析
這篇文章主要介紹了@PathParam和@QueryParam區(qū)別,分享了相關(guān)實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01