SpringBoot定制JSON響應數(shù)據(jù)返回的示例代碼
一、前言
目前微服務項目中RESTful API已經(jīng)是前后端對接數(shù)據(jù)格式的標配模式了,RESTful API是一種基于REST(Representational State Transfer,表述性狀態(tài)轉移)原則的應用程序編程接口(Application Programming Interface),它主要用于Web服務之間的數(shù)據(jù)交互。RESTful API的設計遵循一些核心原則,這些原則使得API更加簡潔、靈活和可擴展。
在構建這些API時,我們往往需要根據(jù)不同的客戶端、用戶角色或業(yè)務需求,靈活地控制返回的數(shù)據(jù)結構和內(nèi)容。Jackson庫的@JsonView注解為我們提供了一種優(yōu)雅且高效的方式來實現(xiàn)這一目標。
二、問題場景
@JsonView 是 Jackson 庫中的一個注解,它允許你定義哪些屬性應該被序列化到 JSON 中,基于不同的“視圖”或“配置”。這在某些情況下非常有用,特別是當你想要為不同的用戶或API端點返回不同級別的詳細信息時。
例如,你可能有一個User對象,其中包含多個屬性,如id、name、email和password。當你為外部API或網(wǎng)站前端返回用戶數(shù)據(jù)時,你可能不希望包含password字段。但是,在內(nèi)部API或某些特定的情況下,你可能想要返回包含password的完整用戶對象。
這就是@JsonView可以幫助你的地方。你可以定義一個或多個“視圖”類,并為你的屬性指定應該出現(xiàn)在哪些視圖中。
在本文中,通過了解@JsonView,你將能夠更好地掌握如何在Spring Boot應用中定制JSON數(shù)據(jù)的輸出,從而提供更加靈活、安全且高效的RESTful API服務。
三、@JsonView主要應用場景
主要應用場景包括:
1.數(shù)據(jù)脫敏:在某些情況下,你可能不希望將數(shù)據(jù)庫中的某些敏感信息(如密碼、密鑰等)暴露給客戶端。通過使用 @JsonView,你可以定義哪些字段應該被包含在特定的視圖中,并在返回數(shù)據(jù)時僅包含這些字段。
2.自定義數(shù)據(jù)輸出:你可以根據(jù)客戶端的需求或權限級別,定義不同的視圖,并在返回數(shù)據(jù)時根據(jù)當前視圖的配置來輸出不同的字段組合。
四、代碼實戰(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;
}
}
輸出結果


不想使用在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;
}
輸出結果


通過@JsonView的代碼展示思考一個問題?
如果沒有該注解你會通過什么方式實現(xiàn)?針對不同的場景定義不同的DTO?通過@JsonIgnore注解?
定義不同的DTO太麻煩,代碼大量冗余。使用@JsonIgnore注解所有的接口都將會忽略該字段,不能精準控制單個API接口。所以整體上看還是使用@JsonView更加的靈活。
五、總結
@JsonView 與 @JsonIgnore 區(qū)別
①. @JsonView 用于控制序列化時的字段組合,允許你根據(jù)不同的視圖返回不同的字段集合。
②. @JsonIgnore 則簡單地忽略某個字段,使其在序列化時不會被包含在 JSON 中。
最后@JsonView 提供了一種靈活且強大的方式來控制序列化的 JSON 數(shù)據(jù)。通過定義視圖和將它們應用到屬性和控制器方法上,你可以根據(jù)需要暴露不同級別的數(shù)據(jù),實現(xiàn) API 的數(shù)據(jù)定制化。
以上就是SpringBoot定制JSON響應數(shù)據(jù)返回的示例代碼的詳細內(nèi)容,更多關于SpringBoot定制JSON數(shù)據(jù)的資料請關注腳本之家其它相關文章!
相關文章
Springboot實現(xiàn)連接多個ElasticSearch數(shù)據(jù)庫的過程
這篇文章介紹了如何在Springboot項目中實現(xiàn)與多個Elasticsearch數(shù)據(jù)庫的高效交互,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2026-03-03
Springboot整合nacos報錯無法連接nacos的解決
這篇文章主要介紹了Springboot整合nacos報錯無法連接nacos的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Spring?IOC容器Bean注解創(chuàng)建對象組件掃描
這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

