Lombok與Jackson實現高效JSON序列化與反序列化

引言

在Java開發中,處理JSON數據是常見需求,而Jackson作為廣泛使用的JSON庫,能夠高效地將Java對象與JSON互相轉換。然而,傳統的POJO(Plain Old Java Object)需要手動編寫大量樣板代碼(如getter、setter、構造器等),這不僅繁瑣還容易出錯。此時,Lombok的注解(如@Data@AllArgsConstructor)可以極大簡化開發。本文將探討如何結合Lombok與Jackson,實現簡潔高效的JSON序列化與反序列化。


一、Jackson 序列化與反序列化的基本原理

Jackson通過反射機制直接訪問對象的字段或方法,無需依賴Serializable接口。其核心流程如下:

  1. 序列化(Object → JSON):通過反射讀取對象的字段值(或調用getter方法),生成JSON字符串。

  2. 反序列化(JSON → Object):解析JSON數據,通過反射調用構造器或setter方法創建并填充對象。


二、Lombok 注解的魔力

Lombok通過在編譯時自動生成代碼,減少了樣板代碼的編寫。以下是關鍵注解的作用:

  • @Data

自動生成gettersetterequals()hashCode()toString()方法。

  • @AllArgsConstructor

生成包含所有字段的全參構造器。

示例:傳統POJO vs. Lombok優化

// 傳統寫法:手動編寫大量代碼public class User {private String name;private int age;public User() {}public User(String name, int age) { /* ... */ }// 省略 getter/setter/equals/hashCode/toString...}// 使用Lombok:一行注解代替所有代碼@Data@AllArgsConstructorpublic class User {private String name;private int age;}

三、結合Lombok與Jackson的完整示例

以下是一個完整的代碼示例,展示如何實現JSON轉換:

1. 添加依賴

確保項目中包含Lombok和Jackson的依賴(以Maven為例):


<dependencies><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope></dependency><!-- Jackson --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency></dependencies>
2. 定義POJO類

@Data@AllArgsConstructorpublic class User {private String name;private int age;}
3. 序列化與反序列化

import com.fasterxml.jackson.databind.ObjectMapper;public class Demo {public static void main(String[] args) throws Exception {ObjectMapper mapper = new ObjectMapper();// 序列化:對象 → JSONUser user = new User("Alice", 30);String json = mapper.writeValueAsString(user);System.out.println(json); // 輸出: {"name":"Alice","age":30}// 反序列化:JSON → 對象String inputJson = "{\"name\":\"Bob\",\"age\":25}";User parsedUser = mapper.readValue(inputJson, User.class);System.out.println(parsedUser); // 輸出: User(name=Bob, age=25)}}

四、解決常見問題

問題1:反序列化時缺少無參構造器

默認情況下,Jackson通過無參構造器創建對象,但@AllArgsConstructor僅生成全參構造器,此時反序列化會報錯:


com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `User`: no creators found.

解決方案

  • 方法1:添加@NoArgsConstructor

顯式生成無參構造器:

```java

@Data

@AllArgsConstructor

@NoArgsConstructor

public class User { /* … */ }

```

  • 方法2:使用@JsonCreator注解

指定全參構造器為反序列化的入口:

```java

@Data

@AllArgsConstructor

public class User {

@JsonCreator

public User(@JsonProperty(“name”) String name, @JsonProperty(“age”) int age) {

this.name?= name;

this.age = age;

}

}

```

問題2:自定義序列化行為

若需忽略空字段或重命名字段,可使用Jackson注解:


@Data@AllArgsConstructor@NoArgsConstructorpublic class User {@JsonProperty("username") // 重命名字段private String name;@JsonInclude(JsonInclude.Include.NON_NULL) // 忽略空值private Integer age;}

五、總結

  • Lombok@Data@AllArgsConstructor顯著簡化了POJO的代碼量。

  • Jackson通過反射實現JSON轉換,無需依賴Serializable接口。

  • 結合使用時需注意無參構造器問題,可通過@NoArgsConstructor@JsonCreator解決。

  • 通過Jackson注解(如@JsonProperty)可靈活控制序列化行為。


最終效果:通過Lombok與Jackson的強強聯合,開發者可以專注于業務邏輯,而非重復的樣板代碼,從而提升開發效率與代碼可維護性。

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

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

相關文章

論文閱讀:PURPLE: Making a Large Language Model a Better SQL Writer

論文地址&#xff1a;PURPLE: Making a Large Language Model a Better SQL Writer 摘要 大語言模型&#xff08;LLM&#xff09;技術在自然語言到 SQL&#xff08;NL2SQL&#xff09;翻譯中扮演著越來越重要的角色。通過大量語料訓練的 LLM 具有強大的自然語言理解能力和基本…

【圖像大模型】ControlNet:深度條件控制的生成模型架構解析

ControlNet&#xff1a;深度條件控制的生成模型架構解析 一、核心原理與技術突破1.1 基礎架構設計1.2 零卷積初始化1.3 多條件控制機制 二、系統架構與實現細節2.1 完整處理流程2.2 性能指標對比 三、實戰部署指南3.1 環境配置3.2 基礎推理代碼3.3 高級控制參數 四、典型問題解…

【從0到1搞懂大模型】chatGPT 中的對齊優化(RLHF)講解與實戰(9)

GPT系列模型的演進 chatgpt系列模型演進的重要節點包含下面幾個模型&#xff08;當然&#xff0c;這兩年模型發展太快了&#xff0c;4o這些推理模型我就先不寫了&#xff09; (Transformer) → GPT-1 → GPT-2 → GPT-3 → InstructGPT/ChatGPT(GPT-3.5) → GPT-4 下面介紹一…

2025年AEI SCI1區TOP,改進麻雀搜索算法MSSA+建筑三維重建,深度解析+性能實測

目錄 1.摘要2.麻雀搜索算法SSA原理3.整體框架4.改進SSA算法5.結果展示6.參考文獻7.代碼獲取8.讀者交流 1.摘要 對現有建筑進行高質量的三維重建對于其維護、修復和管理至關重要。圖像采集中的有效視角規劃會顯著影響基于攝影測量的三維重建質量。復雜的建筑結構常常導致傳統視…

鴻蒙開發:如何實現列表吸頂

前言 本文基于Api13 列表吸頂功能&#xff0c;在實際的開發中有著很大的作用&#xff0c;比如可以讓列表層級之間更加分明&#xff0c;減少一定程度上的視覺混亂&#xff0c;由于吸頂的標題會隨著滾動固定在頂部&#xff0c;可以讓用戶無需反復滑動回頂部確認分組位置&#xff…

使用Zotero的RSS訂閱功能快速了解感興趣領域最新文章

文章目錄 寫在前面中文期刊的RSS訂閱英文期刊的RSS訂閱回到Zotero有啥用&#xff1f; 寫在前面 作為一名研究生或者科研工作者&#xff0c;肯定需要經常檢索自己研究領域的最新文獻&#xff0c;相比于不定期的去各大數據庫檢索文獻&#xff0c;借助RSS訂閱功能則更加便捷。 R…

Windows安裝Docker Desktop開啟 Kubenetes制作并部署本地鏡像

1、安裝Docker Desktop docker desktop官方下載鏈接&#xff0c;下載后一路點下來安裝就好了。 2、制作本地鏡像 跟著docker步驟制作鏡像&#xff0c;需要先配置docker 鏡像源&#xff0c;因為網絡問題 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式學習筆記 - freeRTOS 列表,鏈表,節點跟任務之間關系

一 下圖說明了 freeRTOS 就緒列表&#xff0c;鏈表&#xff0c;節點跟任務之間關系 一個任務對應一個節點&#xff0c;一個鏈表對應一個優先級&#xff0c;一個任務根據優先級可以插入任何一個鏈表中。 插入函數為&#xff0c;這也是freeRTOS的核心函數&#xff0c;對每個任務…

scikit-learn pytorch transformers 區別與聯系

以下是 scikit-learn、PyTorch 和 Transformers 的區別與聯系的表格形式展示: 特性/庫scikit-learnPyTorchTransformers主要用途傳統機器學習算法深度學習框架預訓練語言模型與自然語言處理任務核心功能分類、回歸、聚類、降維、模型選擇等張量計算、自動微分、神經網絡構建與…

【C/C++】從零開始掌握Kafka

文章目錄 從零開始掌握Kafka一、Kafka 基礎知識理解&#xff08;理論&#xff09;1. 核心組件與架構2. 重點概念解析 二、Kafka 面試重點知識梳理三、C 使用 Kafka 的實踐&#xff08;librdkafka&#xff09;1. librdkafka 簡介2. 安裝 librdkafka 四、實戰&#xff1a;高吞吐生…

Spyglass:目標文件(.spq)的結構

相關閱讀 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 預備知識 為了方便檢查&#xff0c;Spyglass向用戶提供Guideware作為檢查參考&#xff1b;Guideware又包含各種方法(Methodology)&#xff0c;應用于設計的不同階段&…

一些Dify聊天系統組件流程圖架構圖

分享一些有助于深入理解Dify聊天模塊的架構圖 整體組件架構圖 #mermaid-svg-0e2XalGLqrRbH1Jy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0e2XalGLqrRbH1Jy .error-icon{fill:#552222;}#mermaid-svg-0e2XalGLq…

地理空間索引:解鎖日志分析中的位置智慧

title: 地理空間索引:解鎖日志分析中的位置智慧 date: 2025/05/24 18:43:06 updated: 2025/05/24 18:43:06 author: cmdragon excerpt: 地理空間索引在日志分析中應用廣泛,涉及用戶登錄IP定位、移動端位置軌跡和物聯網設備位置上報等場景。MongoDB支持2dsphere和2d兩種地理…

分庫分表深度解析

一、為什么要分庫分表&#xff1f; 通常&#xff0c;數據庫性能受到如下幾個限制&#xff1a; 硬件瓶頸&#xff1a;單機的 CPU、內存、磁盤 I/O 等資源總是有限。例如&#xff0c;當單表中的記錄達到上億、甚至更高時&#xff0c;表掃描、索引維護和數據遷移會變得非常慢。單…

QListWidget的函數,信號介紹

前言 Qt版本:6.8.0 該類用于列表模型/視圖 QListWidgetItem函數介紹 作用 QListWidget是Qt框架中用于管理可交互列表項的核心組件&#xff0c;主要作用包括&#xff1a; 列表項管理 支持動態添加/刪除項&#xff1a;addItem(), takeItem()批量操作&#xff1a;addItems()…

ModbusRTU轉profibusDP網關與RAC400通訊報文解析

ModbusRTU轉profibusDP網關與RAC400通訊報文解析 在工業自動化領域&#xff0c;ModbusRTU和ProfibusDP是兩種常見的通信協議。ModbusRTU以其簡單、可靠、易于實現等特點&#xff0c;廣泛應用于各種工業設備之間的通信&#xff1b;而ProfibusDP則是一種高性能的現場總線標準&am…

Python容器

一、容器 1. 列表【】&#xff1a;有序可重復可混裝可修改 [元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;...] ? 可以容納多個元素 ? 可以容納不同類型的元素&#xff08;混裝&#xff09; ? 數據是有序存儲的&#xff08;有下標序號&#xff09; ? 允許重復數…

webpack面試問題

一、核心概念 Webpack的構建流程是什么? 答案: 初始化:讀取配置,創建Compiler對象編譯:從入口文件開始,遞歸分析依賴關系,生成依賴圖模塊處理:調用Loader轉換模塊(如babel-loader)輸出:將處理后的模塊組合成Chunk,生成最終文件Loader和Plugin的區別? Loader:文件…

uniapp-商城-66-shop(2-品牌信息顯示,數據庫讀取的異步操作 放到vuex actions)

完成頁面的顯示&#xff0c;但是還需要進行修改&#xff0c;這里涉及到修改中的信息同步顯示。也會涉及到數據的讀取&#xff0c;修改和同步。 本文介紹了如何使用Vuex管理品牌數據&#xff0c;實現數據的同步顯示和修改。主要內容包括&#xff1a;1.將獲取品牌數據的異步操作封…

使用Pyinstaller打包python,全過程解析【2025最詳細】

一、如何使用 Pyinstaller 打包 Python 程序 1.打開終端 右鍵點擊文件夾空白處&#xff0c;選擇 打開于 > 打開終端 2.安裝 pyinstaller 在打開的終端中&#xff0c;輸入命令【pip install pyinstaller】 使用 Python 包管理工具 pip 來安裝 Pyinstaller。等待安裝過程結…