欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot定制JSON響應數(shù)據(jù)的實現(xiàn)

 更新時間:2025年02月10日 10:14:43   作者:小杰不禿頭  
本文主要介紹了SpringBoot定制JSON響應數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

最近在學習過程中發(fā)現(xiàn)了Jackson庫的@JsonView也可以改變JSON的輸出結構,并且可以更加精細的控制,我平時一般都會定義一些DTO去封裝響應數(shù)據(jù),使用這種方法可以不用創(chuàng)建DTO,更加優(yōu)雅且高效的方式來實現(xiàn)。??

一、如何使用@JsonView這個注解?

我們可以創(chuàng)建多個視圖,每個視圖代表了一組特定的字段。然后,在控制器的方法上,我們可以通過應用這些視圖來指定應該使用哪些字段來序列化返回的實體對象。這種靈活性使得我們能夠輕松應對各種復雜的業(yè)務需求。

二、應用場景

  • 數(shù)據(jù)暴露級別的控制

假設你有一個用戶實體(User),包含了一些基本信息(如姓名、年齡)和一些敏感信息(如密碼、郵箱、身份證)。當你需要提供一個 API 來獲取用戶的基本信息時,你可能不希望暴露敏感信息。通過使用 @JsonView,你可以定義兩個視圖:一個包含基本信息,另一個包含所有信息。然后,在對應的 API 方法上,你可以使用相應的視圖來控制輸出的數(shù)據(jù)。

  • 根據(jù)用戶角色定制數(shù)據(jù)

在某些情況下,不同的用戶角色可能需要看到不同級別的數(shù)據(jù)。例如,管理員可能需要看到用戶的所有信息,而普通用戶只能看到基本信息。通過使用 @JsonView 和 Spring Security,你可以根據(jù)用戶的角色來動態(tài)地決定應該暴露哪些數(shù)據(jù)。

  • API 版本控制

當你的 API 隨時間發(fā)展并引入新功能時,可能會有多個版本的 API。在某些情況下,舊版本的 API 可能不需要包含新引入的字段。通過 @JsonView,你可以為每個 API 版本定義一個視圖,并在需要時切換到相應的視圖。

  • 數(shù)據(jù)聚合和拆分

在某些情況下,你可能需要將多個實體的數(shù)據(jù)聚合到一個 JSON 響應中,或者將一個大實體的數(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;
    }
}

//測試結果跟上面一致

注意:接口返回值必須為MappingJacksonValue。

總結 

@JsonView提供了一種靈活且強大的方式來控制序列化的 JSON 數(shù)據(jù)。通過定義視圖和將它們應用到屬性和控制器方法上,你可以根據(jù)需要暴露不同級別的數(shù)據(jù),實現(xiàn) API 的數(shù)據(jù)定制化。

@JsonView也可以結合其他的注解一起使用,可以更精細的控制,比如:@JsonInclude、@JsonIgnore等等。

到此這篇關于SpringBoot定制JSON響應數(shù)據(jù)的實現(xiàn)的文章就介紹到這了,更多相關SpringBoot定制響應JSON內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Java序列化和反序列化為何要實現(xiàn)Serializable接口

    淺談Java序列化和反序列化為何要實現(xiàn)Serializable接口

    這篇文章主要介紹了淺談Java序列化和反序列化為何要實現(xiàn)Serializable接口,序列化最重要的作用是在傳遞和保存對象時.保證對象的完整性和可傳遞性,對象轉換為有序字節(jié)流,以便在網絡上傳輸或者保存在本地文件中,需要的朋友可以參考下
    2023-12-12
  • Java自帶注解、元注解、自定義注解的區(qū)別

    Java自帶注解、元注解、自定義注解的區(qū)別

    本文主要介紹了Java自帶注解、元注解、自定義注解的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringBoot超詳細講解@Enable*注解和@Import

    SpringBoot超詳細講解@Enable*注解和@Import

    這篇文章主要介紹了SpringBoot?@Enable*注解和@Import,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Mybatis中Mapper標簽總結大全

    Mybatis中Mapper標簽總結大全

    這篇文章主要介紹了Mybatis中Mapper標簽總結大全,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java對數(shù)組實現(xiàn)選擇排序算法的實例詳解

    Java對數(shù)組實現(xiàn)選擇排序算法的實例詳解

    這篇文章主要介紹了Java對數(shù)組實現(xiàn)選擇排序算法的實例,選擇排序的比較次數(shù)為 O(N^2)而交換數(shù)為O(N),需要的朋友可以參考下
    2016-04-04
  • Java 3種方法實現(xiàn)進制轉換

    Java 3種方法實現(xiàn)進制轉換

    這篇文章主要介紹了Java 3種方法實現(xiàn)進制轉換,幫助大家利用Java處理數(shù)據(jù),感興趣的朋友可以了解下
    2020-09-09
  • 在SpringBoot中整合使用Netty框架的詳細教程

    在SpringBoot中整合使用Netty框架的詳細教程

    這篇文章主要介紹了在SpringBoot中整合使用Netty框架的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Spring注解之@Value詳解

    Spring注解之@Value詳解

    這篇文章主要介紹了Spring注解之@Value詳解,@Value可以修飾屬性、方法、參數(shù)、注釋類型,編譯器會將?@Value注解的信息保留在?.class?文件中,并且能被虛擬機讀取,需要的朋友可以參考下
    2024-01-01
  • 圖解Java中歸并排序算法的原理與實現(xiàn)

    圖解Java中歸并排序算法的原理與實現(xiàn)

    歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。本文將通過圖片詳解插入排序的原理及實現(xiàn),需要的可以參考一下
    2022-08-08
  • 淺析NIO系列之TCP

    淺析NIO系列之TCP

    NIO即同步非阻塞式IO,它和傳統(tǒng)的BIO比較最大的區(qū)別在于在執(zhí)行accept、connect、read、write操作時是非阻塞的。很有利于實現(xiàn)用少量線程來處理多個客戶端請求,可以隨時讓線程切換所處理的客戶端,從而可以實現(xiàn)高并發(fā)服務器的開發(fā)
    2021-06-06

最新評論