Jackson 使用方法詳解

Jackson 是 Java 生態中最流行的 JSON 處理庫,也是 Spring Boot 的默認 JSON 解析器。它提供了高性能的 JSON 序列化(對象 → JSON)和反序列化(JSON → 對象)功能。以下是 Jackson 的全面使用指南。


1. 基礎依賴

Maven 依賴

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version> <!-- 使用最新版本 -->
</dependency>

Spring Boot 項目無需手動引入,默認已集成。


2. 核心類:ObjectMapper

ObjectMapper 是 Jackson 的核心類,負責序列化和反序列化操作。

import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper mapper = new ObjectMapper();

3. 基礎用法

3.1 序列化(對象 → JSON)

Person person = new Person("Alice", 30);
String json = mapper.writeValueAsString(person);
// 輸出: {"name":"Alice","age":30}

3.2 反序列化(JSON → 對象)

String json = "{\"name\":\"Alice\",\"age\":30}";
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName()); // 輸出: Alice

3.3 序列化到文件/從文件反序列化

// 寫入文件
mapper.writeValue(new File("person.json"), person);// 從文件讀取
Person person = mapper.readValue(new File("person.json"), Person.class);

4. 常用注解

Jackson 提供注解來控制序列化/反序列化行為。

4.1 字段控制

注解作用示例
@JsonProperty自定義 JSON 字段名@JsonProperty("user_name")
@JsonIgnore忽略字段@JsonIgnore private String password
@JsonInclude僅包含非空字段@JsonInclude(Include.NON_NULL)

4.2 日期格式化

public class Event {@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;
}

4.3 忽略未知字段

@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {private String name;
}

5. 復雜對象處理

5.1 嵌套對象

public class Order {private String orderId;private Person customer; // 嵌套對象
}String json = "{\"orderId\":\"123\",\"customer\":{\"name\":\"Alice\"}}";
Order order = mapper.readValue(json, Order.class);

5.2 集合類型

// List 序列化/反序列化
List<Person> people = Arrays.asList(new Person("Alice"), new Person("Bob"));
String json = mapper.writeValueAsString(people);List<Person> parsedList = mapper.readValue(json, new TypeReference<List<Person>>() {});

5.3 Map 類型

Map<String, Person> personMap = new HashMap<>();
personMap.put("alice", new Person("Alice"));String json = mapper.writeValueAsString(personMap);
Map<String, Person> parsedMap = mapper.readValue(json, new TypeReference<Map<String, Person>>() {});

6. 高級配置

6.1 美化輸出(Pretty Print)

String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person);

6.2 自定義序列化/反序列化

// 自定義序列化器
public class CustomSerializer extends JsonSerializer<Person> {@Overridepublic void serialize(Person value, JsonGenerator gen, SerializerProvider provider) {gen.writeString(value.getName().toUpperCase());}
}// 注冊自定義序列化器
SimpleModule module = new SimpleModule();
module.addSerializer(Person.class, new CustomSerializer());
mapper.registerModule(module);

7. 與 Spring Boot 集成

Spring Boot 自動配置了 ObjectMapper,可通過以下方式自定義:

7.1 全局配置

@Configuration
public class JacksonConfig {@Beanpublic ObjectMapper objectMapper() {ObjectMapper mapper = new ObjectMapper();mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);return mapper;}
}

7.2 REST 控制器示例

@RestController
public class PersonController {@GetMapping("/person")public Person getPerson() {return new Person("Alice", 30); // 自動轉為JSON}@PostMapping("/person")public Person createPerson(@RequestBody Person person) { // 自動從JSON反序列化return person;}
}

8. 性能優化建議

  1. 重用 ObjectMapper
    避免重復創建,推薦作為單例使用。

  2. 使用 TypeReference 處理泛型

    List<Person> people = mapper.readValue(json, new TypeReference<List<Person>>() {});
    
  3. 啟用緩存

    mapper.enable(SerializationFeature.USE_EQUALITY_FOR_OBJECT_ID);
    

9. 常見問題

Q1: 如何處理循環引用?

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class User {private int id;private User friend; // 可能循環引用
}

Q2: 日期格式全局配置

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));

Q3: 忽略 null 字段

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

總結

Jackson 提供了強大而靈活的 JSON 處理能力:

  • 基礎操作ObjectMapper + readValue/writeValue
  • 注解控制@JsonProperty@JsonIgnore
  • 高級特性:自定義序列化、泛型處理、Spring 集成

掌握這些用法后,你可以高效安全地處理任何 JSON 數據場景!

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

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

相關文章

【網絡入侵檢測】基于源碼分析Suricata的統計模塊

【作者主頁】只道當時是尋常 【專欄介紹】Suricata入侵檢測。專注網絡、主機安全,歡迎關注與評論。 1. 概要 ?? 在 Suricata 的配置文件中,stats 節點用于配置統計信息相關的參數,它的主要作用是控制 Suricata 如何收集和輸出統計數據,幫助用戶了解 Suricata 的運行狀態和…

回歸預測 | Matlab實現DBO-LightGBM蜣螂算法優化輕量級梯度提升機多輸入單輸出回歸預測,作者:機器學習之心

回歸預測 | Matlab實現DBO-LightGBM蜣螂算法優化輕量級梯度提升機多輸入單輸出回歸預測&#xff0c;作者&#xff1a;機器學習之心 目錄 回歸預測 | Matlab實現DBO-LightGBM蜣螂算法優化輕量級梯度提升機多輸入單輸出回歸預測&#xff0c;作者&#xff1a;機器學習之心預測效果…

風力發電領域canopen轉Profinet網關的應用

在風力發電領域&#xff0c;開疆canopen轉Profinet網關KJ-PNG-205的應用案例通常涉及將風力渦輪機內部的CANopen網絡與外部的Profinet工業以太網連接起來。這種轉換網關允許風力發電場的控制系統通過Profinet協議收集和監控渦輪機的狀態信息&#xff0c;同時發送控制命令。 風力…

因特網和萬維網

本文來源 &#xff1a;騰訊元寶 因特網&#xff08;Internet&#xff09;和萬維網&#xff08;World Wide Web&#xff0c;簡稱WWW&#xff09;是緊密相關但完全不同的兩個概念&#xff0c;它們的核心區別如下&#xff1a; 本質不同?? ??因特網&#xff08;Internet&#…

Visual Studio 技能:調整軟件界面布局

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;Windows編程&#xff1a;在VS2019里面&#xff0c;調整代碼字體大…

LeetCode 熱題 100_最小路徑和(92_64_中等_C++)(多維動態規劃)

LeetCode 熱題 100_最小路徑和&#xff08;92_64&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;多維動態規劃&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;多維動態規劃&…

Sql刷題日志(day6)

一、筆試 1、insert ignore&#xff1a;在插入數據時忽略主鍵沖突或其他唯一性約束沖突。 如果插入的記錄會導致主鍵沖突&#xff08;如 actor_id 已存在&#xff09;&#xff0c;該語句不會報錯&#xff0c;而是直接忽略插入操作 語法&#xff1a; INSERT IGNORE INTO tab…

Java多線程入門案例詳解:繼承Thread類實現線程

本文通過一個簡單案例&#xff0c;講解如何通過繼承 Thread 類來實現多線程程序&#xff0c;并詳細分析了代碼結構與運行機制。 一、前言 在 Java 中&#xff0c;實現多線程主要有兩種方式&#xff1a; 繼承 Thread 類 實現 Runnable 接口 本文以繼承 Thread 類為例&#x…

Netty在線客服系統落地方案

本文不講然后代碼方面的東西&#xff0c;只聊方案&#xff01;&#xff01; 這方案基于 Spring Boot 2.6、Netty、MyBatis Plus、Redis 構建的一套支持 單體應用 的在線客服系統。 系統支持客戶自由與后臺客服實時聊天、客服未在線釘釘提醒通知客服、消息已讀未讀標記、消息已…

SDK游戲盾、高防IP、高防CDN三者的區別與選型指南

在網絡安全防護領域&#xff0c;SDK游戲盾、高防IP和高防CDN是常見的解決方案&#xff0c;但各自的功能定位、技術實現和適用場景差異顯著。本文將通過對比核心差異&#xff0c;幫助您快速理解三者特點并選擇適合的防護方案。 一、核心功能定位 SDK游戲盾 功能核心&#xff1a…

GRPO有什么缺點,如何改進?

一、GRPO的核心原理與設計目標 Group Relative Policy Optimization(GRPO)是DeepSeek團隊提出的一種強化學習算法,旨在解決傳統PPO(Proximal Policy Optimization)在大語言模型(LLM)訓練中的資源消耗問題。其核心創新在于 通過組內相對獎勵替代價值函數(Critic Model)…

登高架設作業指的是什么?有什么安全操作規程?

登高架設作業是指在高處從事腳手架、跨越架架設或拆除的作業。具體包括以下方面&#xff1a; 腳手架作業 搭建各類腳手架&#xff0c;如落地式腳手架、懸挑式腳手架、附著式升降腳手架等&#xff0c;為建筑施工、設備安裝、高處維修等作業提供安全穩定的工作平臺。對腳手架進行…

前端實現商品放大鏡效果(Vue3完整實現)

前端實現商品放大鏡效果&#xff08;Vue3完整實現&#xff09; 前言 在電商類項目中&#xff0c;商品圖片的細節展示至關重要。放大鏡效果能顯著提升用戶體驗&#xff0c;允許用戶在不跳轉頁面的情況下查看高清細節。本文將基于Vue3實現一個高性能的放大鏡組件&#xff0c;完整…

【C++11特性】Lambda表達式(匿名函數)

一、函數對象 在C中&#xff0c;我們把所有能當作函數使用的對象當作函數對象。 一般來說&#xff0c;如果我們列出一個對象&#xff0c;而它的后面又跟有由花括號包裹的參數列表&#xff0c;就像fun(arg1, arg2, …)&#xff0c;這個對象就被稱為函數對象。函數對象大致可分為…

大模型在肝硬化腹水風險預測及臨床方案制定中的應用研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 1.3 研究方法與數據來源 二、肝硬化及大模型相關理論基礎 2.1 肝硬化概述 2.2 大模型技術原理 2.3 大模型在醫療領域的應用現狀 三、大模型預測肝硬化腹水術前風險 3.1 術前風險因素分析 3.2 大模型預測術前…

MCP:如何通過模型控制推理助力AI模型實現“深度思考”?

MCP:如何通過模型控制推理助力AI模型實現“深度思考”? | Echo_Wish專欄 大家好,我是Echo_Wish,一個在人工智能和Python領域深耕的技術達人。今天咱們聊一個相對前沿的技術話題——MCP (Model Control Propagation),它是如何幫助AI模型“深度思考”,讓機器變得更加智能的…

c++初識

C 基礎入門 本人寫了很多c的服務器和客戶端代碼&#xff0c;這篇文章主要是想幫助初學者快速入門c.這樣就能快速閱讀我的源碼&#xff0c;其實不難c只是比c多了些特性&#xff0c;其實不難&#xff0c;你們就理解為有更多的方式修改函數和調用函數的方式和重寫函數 C 基礎入門…

JVM 生產環境問題定位與解決實戰(八):實戰篇——正則表達式回溯引發的CPU 100%

本文已收錄于《JVM生產環境問題定位與解決實戰》專欄&#xff0c;完整系列見文末目錄 1. 引言 在上一篇文章中&#xff0c;我們深入剖析了OSSClient泄漏引發的FullGC風暴全鏈路排查過程。本文聚焦另一個經典線上問題——正則表達式回溯導致的CPU 100%。在Java應用中&#xff0…

100天精通Python挑戰總覽 | 零基礎到應用實戰!

目錄 ? 為什么發起100天挑戰&#xff1f;?整體學習路線規劃第一階段&#xff5c;基礎篇&#xff08;第1天 - 第50天&#xff09;第二階段&#xff5c;應用篇&#xff08;第51天 - 第100天&#xff09;Web開發篇爬蟲篇數據分析篇AI入門篇 &#x1f3c6;為什么這么劃分&#xf…

C++編譯之(5)-cmake/CMakeLists.txt的編譯使用教程

C++編譯之(5)-cmake/CMakeLists.txt的編譯使用教程 上一節,點這里 1、如何查看cmake的配置參數 那么如何查看當前配置的參數呢,我們可以使用-L參數 cmake .. -L # cmake .. -LAH完全使用命令行,則可以通過多次重復使用cmake … -DOPTION1=ON -D OPTION2=ON配置制定選項;并…