SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實現(xiàn)
前言
最近在學習過程中發(fā)現(xiàn)了Jackson庫的@JsonView也可以改變JSON的輸出結(jié)構(gòu),并且可以更加精細的控制,我平時一般都會定義一些DTO去封裝響應(yīng)數(shù)據(jù),使用這種方法可以不用創(chuàng)建DTO,更加優(yōu)雅且高效的方式來實現(xiàn)。??
一、如何使用@JsonView這個注解?
我們可以創(chuàng)建多個視圖,每個視圖代表了一組特定的字段。然后,在控制器的方法上,我們可以通過應(yīng)用這些視圖來指定應(yīng)該使用哪些字段來序列化返回的實體對象。這種靈活性使得我們能夠輕松應(yīng)對各種復雜的業(yè)務(wù)需求。
二、應(yīng)用場景
- 數(shù)據(jù)暴露級別的控制:
假設(shè)你有一個用戶實體(User),包含了一些基本信息(如姓名、年齡)和一些敏感信息(如密碼、郵箱、身份證)。當你需要提供一個 API 來獲取用戶的基本信息時,你可能不希望暴露敏感信息。通過使用 @JsonView,你可以定義兩個視圖:一個包含基本信息,另一個包含所有信息。然后,在對應(yīng)的 API 方法上,你可以使用相應(yīng)的視圖來控制輸出的數(shù)據(jù)。
根據(jù)用戶角色定制數(shù)據(jù):
在某些情況下,不同的用戶角色可能需要看到不同級別的數(shù)據(jù)。例如,管理員可能需要看到用戶的所有信息,而普通用戶只能看到基本信息。通過使用 @JsonView 和 Spring Security,你可以根據(jù)用戶的角色來動態(tài)地決定應(yīng)該暴露哪些數(shù)據(jù)。
API 版本控制:
當你的 API 隨時間發(fā)展并引入新功能時,可能會有多個版本的 API。在某些情況下,舊版本的 API 可能不需要包含新引入的字段。通過 @JsonView,你可以為每個 API 版本定義一個視圖,并在需要時切換到相應(yīng)的視圖。
數(shù)據(jù)聚合和拆分:
在某些情況下,你可能需要將多個實體的數(shù)據(jù)聚合到一個 JSON 響應(yīng)中,或者將一個大實體的數(shù)據(jù)拆分成多個小實體。通過使用 @JsonView,你可以更輕松地實現(xiàn)這種數(shù)據(jù)的聚合和拆分。
三、實戰(zhàn)案例
定義視圖規(guī)則:
public interface UserView {
// 展示基本信息
interface Basic {}
// 沒有密碼
interface WithoutPassword extends Basic {}
// 展示所有的信息
interface Full extends Basic {}
}定義一個User,在屬性上面添加@JSsonView注解,并指定視圖
@Data
@AllArgsConstructor
public class User {
@JsonView(UserView.Basic.class)
private Long id;
@JsonView(UserView.Basic.class)
private String username;
@JsonView(UserView.Full.class)
private String password;
@JsonView(UserView.Basic.class)
private String nickName;
@JsonView(UserView.Basic.class)
private String email;
@JsonView({UserView.Basic.class,UserView.WithoutPassword.class})
private String phone;
}
在控制器方法上指定視圖,一共有兩種方式:注解方式和編程方式。
注解方式
@RestController
public class testController {
@GetMapping("/user/basic")
@JsonView(UserView.Basic.class)
public User userBasic(){
User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
return user;
}
@GetMapping("/user/noPassword")
@JsonView(UserView.WithoutPassword.class)
public User userNoPassword(){
User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
return user;
}
@GetMapping("/user/full")
@JsonView(UserView.Full.class)
public User userFull(){
User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
return user;
}
}注意:@JsonView允許一個視圖類的數(shù)組,但你只能為每個控制器方法指定一個。如果需要激活多個視圖,可以使用復合接口。
對上面三個接口測試:
// user/basic
{
"id": 1,
"username": "admin",
"nickName": "小杰不禿頭",
"email": "123456@xx.com",
"phone": "188xxxxxxxx"
}
// user/noPassword
{
"id": 1,
"username": "admin",
"nickName": "小杰不禿頭",
"email": "123456@xx.com",
"phone": "188xxxxxxxx"
}
// user/full
{
"id": 1,
"username": "admin",
"password": "123456",
"nickName": "小杰不禿頭",
"email": "123456@xx.com",
"phone": "188xxxxxxxx"
}編程方式
@RestController
public class testController {
@GetMapping("/user/basic")
//@JsonView(UserView.Basic.class)
public MappingJacksonValue userBasic(){
User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
mappingJacksonValue.setSerializationView(UserView.Basic.class);
return mappingJacksonValue;
}
@GetMapping("/user/noPassword")
//@JsonView(UserView.WithoutPassword.class)
public MappingJacksonValue userNoPassword(){
User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
mappingJacksonValue.setSerializationView(UserView.WithoutPassword.class);
return mappingJacksonValue;
}
@GetMapping("/user/full")
//@JsonView(UserView.Full.class)
public MappingJacksonValue userFull(){
User user = new User(1L,"admin","123456","小杰不禿頭","123456@xx.com","188xxxxxxxx");
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(user);
mappingJacksonValue.setSerializationView(UserView.Full.class);
return mappingJacksonValue;
}
}
//測試結(jié)果跟上面一致注意:接口返回值必須為MappingJacksonValue。
總結(jié)
@JsonView提供了一種靈活且強大的方式來控制序列化的 JSON 數(shù)據(jù)。通過定義視圖和將它們應(yīng)用到屬性和控制器方法上,你可以根據(jù)需要暴露不同級別的數(shù)據(jù),實現(xiàn) API 的數(shù)據(jù)定制化。
@JsonView也可以結(jié)合其他的注解一起使用,可以更精細的控制,比如:@JsonInclude、@JsonIgnore等等。
到此這篇關(guān)于SpringBoot定制JSON響應(yīng)數(shù)據(jù)的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot定制響應(yīng)JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)Kafka生產(chǎn)者和消費者的示例
這篇文章主要介紹了Java實現(xiàn)Kafka生產(chǎn)者和消費者的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
springboot mybatis調(diào)用多個數(shù)據(jù)源引發(fā)的錯誤問題
這篇文章主要介紹了springboot mybatis調(diào)用多個數(shù)據(jù)源引發(fā)的錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Eclipse安裝Aptana插件(注意對應(yīng)版本問題)
這篇文章主要為大家詳細介紹了Eclipse安裝Aptana插件的相關(guān)資料,特別注意對應(yīng)版本問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02

