@JsonIgnoreProperties注解詳解

@JsonIgnoreProperties是 Jackson 庫中的一個重要注解,用于在 JSON 序列化(對象轉 JSON)和反序列化(JSON 轉對象)過程中??控制屬性的可見性??。它提供了更高級別的屬性忽略能力,特別適合處理復雜場景。

一、核心功能解析

1. 忽略特定屬性

@JsonIgnoreProperties({"password", "ssn"})
public class User {private String username;private String password;  // 序列化和反序列化時被忽略private String ssn;       // 序列化和反序列化時被忽略
}

2. 忽略未知屬性

@JsonIgnoreProperties(ignoreUnknown = true)
public class ApiResponse {private int status;// JSON 中包含的其他未知屬性將被忽略
}

3. 允許屬性(與 @JsonIgnore結合)

@JsonIgnoreProperties(allowGetters = true, allowSetters = true)
public class Product {@JsonIgnoreprivate String internalCode; // 可序列化但不可反序列化
}

二、主要應用場景

1. 敏感數據隱藏

@JsonIgnoreProperties({"creditCardNumber", "cvv"})
public class Order {private String orderId;private double amount;private String creditCardNumber; // 不會出現在JSON中private String cvv;               // 不會出現在JSON中
}

2. API 版本兼容

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserV2 {private String id;private String name;// 舊版本API返回的額外字段將被忽略
}

3. 循環引用處理

@JsonIgnoreProperties("manager")
public class Employee {private String name;private Employee manager; // 避免序列化時無限遞歸
}

4. 部分更新操作

@JsonIgnoreProperties(ignoreUnknown = true, value = {"id", "createdAt"})
public class UpdateUserRequest {private String id;         // 不允許更新private String username;   // 可更新private String email;      // 可更新private Date createdAt;    // 不允許更新
}

三、注解參數詳解

參數

類型

默認值

描述

value

String[]

{}

要忽略的屬性列表

ignoreUnknown

boolean

false

是否忽略未知屬性

allowGetters

boolean

false

是否允許序列化(getter)

allowSetters

boolean

false

是否允許反序列化(setter)

allowSetters

boolean

false

是否允許反序列化(setter)

prefix

String

""

屬性名前綴匹配

names

String[]

{}

value的別名

ignore

boolean

false

Jackson 2.13+ 新增,簡化配置

四、與其他注解對比

注解

作用范圍

主要功能

優勢

??@JsonIgnoreProperties??

類級別

批量忽略屬性

集中管理多個屬性

??@JsonIgnore??

字段/方法級別

忽略單個屬性

精確控制單個屬性

??@JsonProperty(access)??

字段/方法級別

細粒度控制

可指定 READ_ONLY/WRITE_ONLY

??@JsonView??

字段/方法級別

視圖控制

不同場景展示不同屬性

五、完整使用示例

1. 安全數據傳輸

@JsonIgnoreProperties(value = {"password", "salt"}, ignoreUnknown = true)
public class UserDTO {private Long id;private String username;private String password; // 不序列化private String salt;     // 不序列化// 允許獲取密碼(僅內部使用)@JsonIgnoreProperties(allowGetters = true)public String getPassword() {return password;}
}

2. API 響應包裝

@JsonIgnoreProperties(ignoreUnknown = true)
public class ApiResponse<T> {private int code;private String message;private T data;// 忽略客戶端不需要的字段@JsonIgnoreprivate String internalTraceId;
}

3. 嵌套對象處理

@JsonIgnoreProperties("employees")
public class Department {private String name;private List<Employee> employees; // 避免序列化時無限遞歸
}public class Employee {private String name;@JsonIgnoreProperties("department")private Department department; // 允許序列化部門但不包含員工列表
}

六、最佳實踐指南

1. 安全建議

// 始終忽略敏感字段
@JsonIgnoreProperties({"password", "apiKey", "secretToken"})
public class UserProfile {// ...
}

2. 版本兼容策略

// 新舊API兼容方案
@JsonIgnoreProperties(ignoreUnknown = true, value = {"legacyField"})
public class ModernEntity {private String newField;@JsonIgnore // 顯式忽略private String legacyField;
}

3. 與 Lombok 集成

@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product {private Long id;private String name;@JsonIgnoreprivate BigDecimal costPrice; // 成本價不暴露
}

4. 動態控制(Jackson 2.13+)

@JsonIgnoreProperties(ignore = {"createdBy", "updatedBy"})
public class AuditEntity {private String createdBy;private String updatedBy;private Date createdAt;private Date updatedAt;
}

七、常見問題解決方案

1. 忽略所有 setter 操作

@JsonIgnoreProperties(allowSetters = false)
public class SecureConfig {private String masterKey; // 可序列化但不可反序列化
}

2. 處理布爾屬性沖突

@JsonIgnoreProperties("active")
public class Account {@JsonProperty("isActive") // 使用不同名稱private boolean active;
}

3. 忽略帶前綴的屬性

@JsonIgnoreProperties(prefix = "_")
public class SystemMetrics {private int requests;private int _internalCounter; // 被忽略
}

八、進階用法

1. 組合使用注解

@JsonIgnoreProperties(ignoreUnknown = true)
public class Order {private String id;@JsonIgnoreProperties({"creditCard", "cvv"})private PaymentInfo payment; // 嵌套忽略
}

2. 元注解自定義

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@JsonIgnoreProperties({"createdAt", "updatedAt"})
public @interface AuditIgnore {}@AuditIgnore
public class User {private String name;private Date createdAt; // 自動忽略
}

3. 自定義邏輯(Jackson 2.12+)

@JsonIgnoreProperties(value = "secret", ignore = falsecondition = JsonIgnoreProperties.Condition.CUSTOM,valueFilter = SensitiveDataFilter.class
)
public class SecureDocument {private String content;private String secret;
}public class SensitiveDataFilter implements Predicate<Object> {@Overridepublic boolean test(Object value) {return !SecurityContext.isAdmin(); // 管理員可見}
}

九、與其他庫集成

1. Spring Boot 配置

@Configuration
public class JacksonConfig {@Beanpublic Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {return builder -> builder.failOnUnknownProperties(false) // 全局忽略未知屬性.mixIn(User.class, UserMixin.class);}@JsonIgnoreProperties({"password", "salt"})public abstract class UserMixin {}
}

2. JPA 實體序列化

@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Customer {@Idprivate Long id;@OneToMany(mappedBy = "customer")@JsonIgnoreProperties("customer") // 避免循環引用private List<Order> orders;
}

十、總結

1. 核心價值

  • ??安全性??:隱藏敏感數據

  • ??兼容性??:處理不同版本API

  • ??健壯性??:避免未知屬性導致的錯誤

  • ??性能??:減少傳輸數據量

2. 使用場景

  • API 響應數據脫敏

  • 新舊系統接口兼容

  • 處理對象循環引用

  • 動態控制屬性可見性

  • 領域模型與DTO轉換

3. 最佳實踐

  1. ??優先類級別控制??:使用 @JsonIgnoreProperties集中管理

  2. ??細粒度補充??:配合 @JsonIgnore處理特殊屬性

  3. ??開放原則??:默認 ignoreUnknown = true提高兼容性

  4. ??安全第一??:始終忽略敏感字段

  5. ??版本策略??:使用注解實現平滑升級

@JsonIgnoreProperties是 Jackson 庫中處理 JSON 屬性可見性的瑞士軍刀,特別在構建健壯的 API 系統和處理復雜對象關系時,能顯著提高代碼的穩定性和安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94240.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

紅酒數據集預處理實戰:缺失值處理的 5 種打開方式,從入門到進階一步到位

在數據分析與建模流程中&#xff0c;缺失值處理是數據預處理階段的關鍵步驟&#xff0c;直接影響后續模型的準確性與穩定性。本文以紅酒數據集為研究對象&#xff0c;詳細介紹如何通過基礎統計方法&#xff08;均值、中位數、眾數&#xff09;、完整案例分析&#xff08;CCA&am…

Node.js 開發 JavaScript SDK 包的完整指南(AI)

一、核心概念SDK 包定義 專為特定服務/平臺封裝的工具庫&#xff0c;提供標準化 API 調用、錯誤處理、類型聲明等功能。示例&#xff1a;支付寶 SDK、AWS SDK、微信小程序 SDK。技術棧選擇 語言&#xff1a;JavaScript/TypeScript&#xff08;推薦 TS&#xff0c;便于類型提示&…

Redis實戰-基于Session實現分布式登錄

1.流程分析1.1發送短信驗證碼提交手機號的時候要進行校驗手機號&#xff0c;校驗成功才會去生成驗證碼&#xff0c;將驗證碼保存到session&#xff0c;發生他把這部分那。1.2短信驗證碼登錄/注冊如果提交手機號和驗證碼之后&#xff0c;校驗一致才進行根據手機號查詢用戶&#…

瘋狂星期四文案網第47天運營日記

網站運營第47天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況 必應現在是邊收錄邊k頁面 百度快倒閉 網站優化點 完善工作流&#xff0c;全面實現文案自動化采集&#xff0c;se…

Vue生命周期以及自定義鉤子和路由

Vue生命周期常用的onMounted掛載后執行和onUnmounted卸載前以及onupdated更新后實際上用react對比就是useEffect&#xff0c;而且掛載順序也是子組件先于父組件然后往外的棧結構&#xff0c;先進后出。1.Vue的生命周期<template><h2>當前求和為{{ sum }}</h2>…

探索Thompson Shell:Unix初代Shell的智慧

引言 在計算機科學的漫漫長河中&#xff0c;Thompson Shell 無疑占據著舉足輕重的開創性地位&#xff0c;它是 Unix 系統的第一個 shell&#xff0c;誕生于 1971 年&#xff0c;由計算機領域的傳奇人物 Ken Thompson 開發。在那個計算機技術剛剛起步、硬件資源極度匱乏的年代&a…

MySQL B+ 樹索引詳解:從原理到實戰優化

引言在現代數據庫應用中&#xff0c;查詢效率是影響系統性能的關鍵因素之一。而索引&#xff0c;尤其是 B 樹索引&#xff0c;是 MySQL 中最常用、最重要的性能優化手段。正確使用索引可以將查詢時間從毫秒級降低到微秒級&#xff0c;極大地提升應用響應速度。1. B 樹索引的重要…

計算機內存中的整型存儲奧秘、大小端字節序及其判斷方法

目錄 一、回顧與引入&#xff1a;整數在內存中的存儲方式 為什么要采用補碼存儲&#xff1f; 二、大小端字節序及其判斷方法 1、什么是大小端&#xff1f; 2、為什么存在大小端&#xff1f; 3、練習 練習1&#xff1a;簡述大小端概念并設計判斷程序&#xff08;百度面試…

Redis 最常用的 5 種數據類型

Redis 支持多種靈活的數據類型&#xff0c;每種類型針對特定場景優化。以下是 **Redis 最常用的 5 種數據類型**及其核心特點和應用場景&#xff1a;1. 字符串&#xff08;String&#xff09;描述&#xff1a;最基本的數據類型&#xff0c;可存儲文本、數字&#xff08;整數/浮…

【嵌入式】RK3588 對比 NVIDIA Jetson,Radxa Rock 5B vs Orange Pi 5 Max

RK3588這個芯片,適合AI應用么,為什么這么貴呢 AI 邊緣盒子里的旗艦芯 深度分析一下 RK3588(瑞芯微 Rockchip RK3588) 為什么被很多人關注在 AI 應用,以及它價格偏高的原因。 ?? 1. RK3588 的基本情況 制程:8nm(Samsung 8nm LP) CPU:8 核 big.LITTLE 架構(4 Cortex-…

暴雨讓高性能計算更“冷靜”

當AI大模型的參數突破萬億&#xff0c;當深地探測的精度邁向微米&#xff0c;當數字經濟的脈搏與千行百業深度共振&#xff0c;算力已成為驅動時代向前的核心引擎。然而&#xff0c;傳統風冷技術在高密度算力需求面前漸顯乏力——機柜內的熱浪如同無形的枷鎖&#xff0c;既制約…

SpringAI集成MCP

文章目錄1_調用公用MCP2_Stdio方式3_Stdio實現原理4_SSE方式5_自定義MCP客戶端6_MCP Server權限控制SpringAI 通過 SpringBoot 集成擴展了 MCP Java SDK &#xff0c;提供了客戶端和服務端 starter&#xff0c;讓 AI 應用程序快速支持 MCP。接下來直接演示。 1_調用公用MCP 在…

Spring Start Here 讀書筆記:第10章 Implementing REST services

REST 服務可用于實現兩個應用之間的通訊&#xff0c;包括 Web 應用中的客戶端和服務器之間&#xff0c;移動應用與后端服務之間&#xff0c;或兩個后端服務之間。 10.1 使用 REST 服務在應用之間交換數據 REST端點是應用程序通過 Web 協議公開服務的方式&#xff0c;因此也稱…

SYBASE ASE、Oracle、MySQL/MariaDB、SQL Server及PostgreSQL在郵件/短信發送功能上的全面橫向對比報告

以下是對SYBASE ASE、Oracle、MySQL/MariaDB、SQL Server及PostgreSQL在郵件/短信發送功能上的全面橫向對比報告&#xff08;截至2025年8月最新版本&#xff09;&#xff0c;涵蓋技術實現、配置復雜度、適用場景及權威評測&#xff1a;??一、郵件發送能力對比????1. Orac…

服務器與客戶端

目錄 一、服務器&#xff08;Server&#xff09; 核心特點 常見類型 二、客戶端&#xff08;Client&#xff09; 核心特點 常見類型 客戶端與服務器的交互流程 補充&#xff1a;與 “對等網絡&#xff08;P2P&#xff09;” 的區別 C/S模式 一、C/S 模式的核心原理 …

GaussDB 并發自治事務數達到最大值處理案例

1 業務背景自治事務&#xff08;Autonomous Transactions&#xff09;是一種高級特性&#xff0c;允許你在一個事務中執行另一個獨立的事務。這種機制特別有用&#xff0c;尤其是在需要在一個事務中執行多個操作但又不想因為其中一個操作失敗而影響整個事務的場景。2 業務影響在…

【傳奇開心果系列】Flet分頁自定義組件CustomPaginationComponent封裝版自定義模板

Flet分頁自定義組件CustomPaginationComponent封裝版自定義模板一、效果展示GIF動圖二、應用場景三、特色說明四、源碼下載地址一、效果展示GIF動圖 二、應用場景 圖片瀏覽應用&#xff1a; 用戶可以通過分頁組件瀏覽多張圖片&#xff0c;每點擊一次“上一頁”或“下一頁”按鈕…

數據安全——39頁解讀數字化轉型大數據安全基礎培訓方案【附全文閱讀】

適應人群為企業數據安全管理人員、IT 運維人員、數字化轉型決策者、網絡安全工程師及關注大數據安全的從業人員。主要內容圍繞數字化轉型中大數據安全展開,核心包括基礎概念(信息、數據與大數據的定義及區別,大數據 4V 特點與來源);安全風險(企業面臨的數據資產管理缺失、…

week3-[二維數組]小方塊

week3-[二維數組]小方塊 題目描述 如果四個數 a,b,c,da,b,c,da,b,c,d 可以分成兩組&#xff0c;每組兩個數&#xff0c;滿足每組里面的兩個數一樣&#xff0c;那么稱這四個數是好的。 比如&#xff0c;2,5,2,52,5,2,52,5,2,5 是好的&#xff0c;因它滿足兩組&#xff1a;222 與…

Swift 項目結構詳解:構建可維護的大型應用

Swift 項目結構詳解&#xff1a;構建可維護的大型應用一、基礎結構&#xff08;推薦新手使用&#xff09;二、組件化結構&#xff08;企業級應用推薦&#xff09;層級架構&#xff1a;MVVM Coordinator路由實現&#xff08;Coordinator模式&#xff09;三、通用組件實現DI&…