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

SpringBoot定制JSON響應(yīng)數(shù)據(jù)返回的示例代碼

 更新時間:2024年05月19日 16:35:56   作者:奮斗的袍子007  
@JsonView 是 Jackson 庫中的一個注解,它允許你定義哪些屬性應(yīng)該被序列化到 JSON 中,基于不同的“視圖”或“配置”,在本文中,通過了解@JsonView,你將能夠更好地掌握如何在Spring Boot應(yīng)用中定制JSON數(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é)

    本篇文章主要介紹了SpringMVC前端和后端數(shù)據(jù)交互總結(jié),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • java  多線程的三種構(gòu)建方法

    java 多線程的三種構(gòu)建方法

    這篇文章主要介紹了java 多線程的三種構(gòu)建方法的相關(guān)資料,這里提供三種實現(xiàn)方法,希望大家能夠掌握,很重要的基礎(chǔ)知識,需要的朋友可以參考下
    2017-09-09
  • Spring Boot如何實現(xiàn)定時任務(wù)的動態(tài)增刪啟停詳解

    Spring 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-07
  • Java操作FTP實現(xiàn)上傳下載功能

    Java操作FTP實現(xiàn)上傳下載功能

    這篇文章主要為大家詳細介紹了Java如何通過操作FTP實現(xiàn)上傳下載的功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-11-11
  • SpringBoot整合SpringSecurity和JWT和Redis實現(xiàn)統(tǒng)一鑒權(quán)認證

    SpringBoot整合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-11
  • SpringBoot優(yōu)化啟動速度的方法實現(xiàn)

    SpringBoot優(yōu)化啟動速度的方法實現(xiàn)

    本篇文章主要介紹了SpringBoot優(yōu)化啟動速度的方法實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例

    Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法示例

    這篇文章主要介紹了Java實現(xiàn)微信公眾號自定義菜單的創(chuàng)建方法,結(jié)合實例形式分析了java創(chuàng)建微信公眾號自定義菜單的具體步驟、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-10-10
  • MybatisPlus實現(xiàn)邏輯刪除的示例代碼

    MybatisPlus實現(xiàn)邏輯刪除的示例代碼

    本文主要介紹了Mybatis?Plus實現(xiàn)邏輯刪除的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解Java中NullPointerException的處理方法

    詳解Java中NullPointerException的處理方法

    這篇文章將帶大家來單獨看一個很常見的異常--空指針異常,這個可以說是每個Java程序員都必知的異常,所以我們不得不單獨學(xué)習(xí)一下,文中有詳細的代碼示例,需要的朋友可以參考下
    2023-08-08
  • @PathParam和@QueryParam區(qū)別簡析

    @PathParam和@QueryParam區(qū)別簡析

    這篇文章主要介紹了@PathParam和@QueryParam區(qū)別,分享了相關(guān)實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論