Jackson 詳解

目錄

前言

????????Jackson 是 Java 生態中最流行的 JSON 處理庫之一,廣泛應用于 RESTful API、數據存儲和傳輸等場景。它提供了高效、靈活的 JSON 序列化和反序列化功能,支持注解、模塊化設計和多種數據格式(如 XML、YAML)。本文將詳細介紹 Jackson 的核心模塊、使用方法、注意事項以及代碼示例。

1. Jackson 的核心模塊

2. 使用 Jackson

2.1 添加依賴

2.2 核心類:ObjectMapper

2.3 基本使用

序列化

反序列化:

3. 使用注解

3.1 常用注解

3.2 示例代碼

4. 高級用法

4.1 處理復雜對象

4.2 自定義序列化和反序列化

4.3 處理多態類型

5. 注意事項

6. 總結


前言

????????Jackson 是 Java 生態中最流行的 JSON 處理庫之一,廣泛應用于 RESTful API、數據存儲和傳輸等場景。它提供了高效、靈活的 JSON 序列化和反序列化功能,支持注解、模塊化設計和多種數據格式(如 XML、YAML)。本文將詳細介紹 Jackson 的核心模塊、使用方法、注意事項以及代碼示例。

1. Jackson 的核心模塊

Jackson 采用模塊化設計,核心模塊包括:

  1. jackson-core
    • 提供底層 JSON 解析和生成功能。
    • 包含?JsonParser(解析 JSON)和?JsonGenerator(生成 JSON)。
  2. jackson-annotations
    • 提供豐富的注解,用于控制 JSON 的序列化和反序列化行為。
  3. jackson-databind
    • 提供高級數據綁定功能,將 JSON 數據與 Java 對象相互轉換。
  4. jackson-dataformat-xml
    • 支持 XML 格式的序列化和反序列化。
  5. jackson-dataformat-yaml
    • 支持 YAML 格式的序列化和反序列化。

2. 使用 Jackson

2.1 添加依賴

在 Maven 項目中,添加以下依賴:

<dependencies><!-- Jackson 核心模塊 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.13.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.13.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!-- 可選:支持 XML --><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.13.3</version></dependency><!-- 可選:支持 YAML --><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.13.3</version></dependency>
</dependencies>

2.2 核心類:ObjectMapper

ObjectMapper 是 Jackson 的核心類,用于實現 JSON 與 Java 對象的相互轉換。以下是其常用方法:

方法描述
writeValueAsString(Object)將 Java 對象序列化為 JSON 字符串。
readValue(String, Class)將 JSON 字符串反序列化為 Java 對象。
writeValue(File, Object)將 Java 對象序列化到文件中。
readValue(File, Class)從文件中反序列化 JSON 數據。

2.3 基本使用

序列化
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {User user = new User("John", 30);ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(user);System.out.println(json); // 輸出: {"name":"John","age":30}}
}
class User {private String name;private int age;// 構造函數、Getter 和 Setterpublic User(String name, int age) {this.name = name;this.age = age;}public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }
}
反序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {String json = "{\"name\":\"John\",\"age\":30}";ObjectMapper mapper = new ObjectMapper();User user = mapper.readValue(json, User.class);System.out.println(user.getName()); // 輸出: JohnSystem.out.println(user.getAge());  // 輸出: 30}
}

3. 使用注解

Jackson 提供了豐富的注解,用于控制 JSON 的序列化和反序列化行為。

3.1 常用注解

注解描述
@JsonProperty指定 JSON 字段的名稱。
@JsonIgnore忽略字段,不參與序列化和反序列化。
@JsonFormat指定日期、時間等字段的格式化方式。
@JsonInclude控制字段在序列化時的包含規則(如非空字段才序列化)。
@JsonCreator指定反序列化時的構造函數或工廠方法。
@JsonAlias為字段指定多個 JSON 別名,反序列化時可以匹配多個名稱。

3.2 示例代碼

import com.fasterxml.jackson.annotation.*;
public class User {@JsonProperty("user_name")private String name;@JsonIgnoreprivate String password;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthDate;@JsonInclude(JsonInclude.Include.NON_NULL)private String email;// 構造函數、Getter 和 Setter
}

4. 高級用法

4.1 處理復雜對象

Jackson 支持嵌套對象、集合和映射的序列化和反序列化。

class Address {private String city;private String street;// 構造函數、Getter 和 Setter
}
class User {private String name;private List<Address> addresses;// 構造函數、Getter 和 Setter
}

4.2 自定義序列化和反序列化

通過實現 JsonSerializerJsonDeserializer,可以自定義序列化和反序列化邏輯。

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
@JsonSerialize(using = CustomSerializer.class)
class User {private String name;// 構造函數、Getter 和 Setter
}
class CustomSerializer extends JsonSerializer<User> {@Overridepublic void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeStartObject();gen.writeStringField("user_name", user.getName());gen.writeEndObject();}
}

4.3 處理多態類型

使用 @JsonTypeInfo@JsonSubTypes 處理多態類型。

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "dog"),@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
abstract class Animal {private String name;// 構造函數、Getter 和 Setter
}
class Dog extends Animal {private String breed;// 構造函數、Getter 和 Setter
}
class Cat extends Animal {private boolean likesCream;// 構造函數、Getter 和 Setter
}

5. 注意事項

  1. 性能優化
    • 重用?ObjectMapper?實例,避免重復創建。
  2. 安全性
    • 反序列化時,避免直接反序列化不可信的 JSON 數據,防止反序列化攻擊。
  3. 版本兼容性
    • 確保?jackson-corejackson-annotations?和?jackson-databind?的版本一致。
  4. 空值處理
    • 使用?@JsonInclude(JsonInclude.Include.NON_NULL)?忽略空值字段。

補充:

1. JSON處理庫的作用

1.1 Fastjson

Fastjson是阿里巴巴開源的高性能JSON庫,主要用于Java對象與JSON字符串之間的序列化反序列化。它支持復雜對象的處理,包括嵌套對象、泛型、集合等,廣泛應用于高性能場景。

1.2 org.json

org.json是一個輕量級的JSON處理庫,提供了JSON的解析、生成和操作功能。它的API設計簡單,適合初學者和快速開發場景。

1.3 json-simple

json-simple是一個簡單的JSON處理庫,專注于基本的JSON解析和生成。它的API設計非常簡潔,適合快速處理簡單的JSON數據。


2. 技術原理

2.1 Fastjson

Fastjson的核心技術包括:

  • 高性能解析:通過優化算法和數據結構,Fastjson在解析JSON時速度非常快。
  • 動態類型處理:支持復雜對象的序列化和反序列化,包括泛型、嵌套對象等。
  • 自定義序列化:允許開發者通過注解或自定義序列化器控制JSON的生成和解析。

2.2 org.json

org.json的核心技術包括:

  • 輕量級設計:庫的體積較小,適合資源有限的環境。
  • 簡單API:提供了JSONObject和JSONArray等核心類,易于上手。
  • 功能齊全:支持JSON的解析、生成和操作。

2.3 json-simple

json-simple的核心技術包括:

  • 簡潔API:提供了JSONObject和JSONArray等核心類,API設計非常簡潔。
  • 輕量級設計:庫的體積較小,適合快速開發場景。
  • 基礎功能:支持基本的JSON解析和生成。

3. 示例代碼與輸出結果

3.1 Fastjson示例

代碼:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class FastjsonExample {public static void main(String[] args) {// 將Java對象轉換為JSON字符串User user = new User("John", 30);String jsonString = JSON.toJSONString(user);System.out.println("Fastjson - JSON String: " + jsonString);// 將JSON字符串轉換為Java對象User parsedUser = JSON.parseObject(jsonString, User.class);System.out.println("Fastjson - Parsed User: " + parsedUser);// 操作JSON對象JSONObject jsonObject = JSON.parseObject(jsonString);jsonObject.put("age", 31);System.out.println("Fastjson - Updated JSON: " + jsonObject.toJSONString());}
}class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}// Getters and Setters@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "}";}
}

?輸出結果:

Fastjson - JSON String: {"age":30,"name":"John"}
Fastjson - Parsed User: User{name='John', age=30}
Fastjson - Updated JSON: {"age":31,"name":"John"}

3.2 org.json示例

代碼:

import org.json.JSONObject;public class OrgJsonExample {public static void main(String[] args) {// 創建JSON對象JSONObject jsonObject = new JSONObject();jsonObject.put("name", "John");jsonObject.put("age", 30);System.out.println("org.json - JSON Object: " + jsonObject);// 從JSON字符串解析JSON對象String jsonString = "{\"name\":\"John\",\"age\":30}";JSONObject parsedJsonObject = new JSONObject(jsonString);System.out.println("org.json - Parsed JSON Object: " + parsedJsonObject);// 操作JSON對象parsedJsonObject.put("age", 31);System.out.println("org.json - Updated JSON Object: " + parsedJsonObject);}
}

?輸出結果:

org.json - JSON Object: {"name":"John","age":30}
org.json - Parsed JSON Object: {"name":"John","age":30}
org.json - Updated JSON Object: {"name":"John","age":31}

3.3 json-simple示例

代碼:

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;public class JsonSimpleExample {public static void main(String[] args) throws Exception {// 創建JSON對象JSONObject jsonObject = new JSONObject();jsonObject.put("name", "John");jsonObject.put("age", 30);System.out.println("json-simple - JSON Object: " + jsonObject.toJSONString());// 從JSON字符串解析JSON對象String jsonString = "{\"name\":\"John\",\"age\":30}";JSONParser parser = new JSONParser();JSONObject parsedJsonObject = (JSONObject) parser.parse(jsonString);System.out.println("json-simple - Parsed JSON Object: " + parsedJsonObject);// 操作JSON對象parsedJsonObject.put("age", 31);System.out.println("json-simple - Updated JSON Object: " + parsedJsonObject.toJSONString());}
}

輸出結果:

json-simple - JSON Object: {"name":"John","age":30}
json-simple - Parsed JSON Object: {"name":"John","age":30}
json-simple - Updated JSON Object: {"name":"John","age":31}

?

4. 對比與總結

特性Fastjsonorg.jsonjson-simple
性能高性能,適合大數據量處理性能一般性能一般
功能性功能強大,支持復雜對象功能齊全功能基礎
易用性API設計簡單,易于上手API設計簡單,適合初學者API設計簡潔,快速上手
體積較大較小較小

結論:

  • 如果需要處理大量的JSON數據,并且對性能有較高要求,Fastjson?是最佳選擇。
  • 如果需要一個輕量級且功能齊全的JSON庫,org.json?是一個不錯的選擇。
  • 如果只需要快速處理簡單的JSON數據,json-simple?是最簡單的選擇。

5. 注意事項

  • Fastjson的安全性:Fastjson在過去曾被發現存在一些安全漏洞,建議使用最新版本并關注官方更新。
  • 庫的選擇:根據項目需求和開發環境選擇合適的JSON庫,避免過度依賴單一庫。

使用前導入對應的庫:

6. 總結

Jackson 是 Java 生態中最強大的 JSON 處理庫,提供了高效、靈活的序列化和反序列化功能。通過合理使用注解和高級特性,可以滿足各種復雜的 JSON 處理需求。無論是 RESTful API、數據存儲還是數據傳輸,Jackson 都是不可或缺的工具。

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

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

相關文章

H.264,H.265,H.266標準技術改進

關于H.264,H.265,H.266相關資料鏈接&#xff1a; 標準及中文資料鏈接 視頻編碼中的主要技術 視頻編碼的目標是在保證視頻質量的前提下&#xff0c;盡可能減少數據量。以下是視頻編碼中的核心技術&#xff1a; 塊劃分&#xff08;Block Partitioning&#xff09; 將視頻幀劃分…

clickhouse安裝路徑

《ClickHouse安裝路徑指南》 大家好&#xff0c;今天我們將一起學習如何在電腦上找到和理解ClickHouse的安裝路徑。這將幫助學生、科研人員以及任何對數據庫技術感興趣的人更好地管理他們的數據查詢工作。 ClickHouse是一款列式存儲數據庫管理系統&#xff08;DBMS&#xff09…

時序數據庫 InfluxDB 3.0 版本性能實測報告:寫入吞吐量提升效果驗證

亮點總結&#xff1a; TSBS 測試表明&#xff0c;對于少于 100 萬臺設備的數據集&#xff0c;InfluxDB OSS 3.0 的數據寫入速度實際上比 InfluxDB OSS 1.8 更慢。 對于 100 萬臺及以上設備的數據集&#xff0c;InfluxDB OSS 3.0 的數據寫入性能才開始超過 InfluxDB OSS 1.8。…

AS32X601雙核鎖步MCU技術優勢分析

AS32X601是國科安芯公司研制的一系列基于32位RISC-V指令集車規級MCU處理器芯片。主頻高達180MHz&#xff0c;支持雙核鎖步架構&#xff0c;基于軟錯誤防護技術加持&#xff0c;顯著提高芯片安全性能。產品具有高安全、低失效、多IO、低成本、抗輻照等特點。 一、功能安全與可靠…

基于 LeNet 網絡的 MNIST 數據集圖像分類

1.LeNet的原始實驗數據集MNIST 名稱&#xff1a;MNIST手寫數字數據集 數據類型&#xff1a;灰度圖 &#xff08;一通道&#xff09; 圖像大小&#xff1a;28*28 類別數&#xff1a;10類&#xff08;數字0-9&#xff09; 1.通過torchvision.datasets.MNIST下載并保存到本地…

電池綜合測試儀:科技賦能,精準守護能源安全

在當今這個科技日新月異的時代&#xff0c;電池作為眾多電子設備的心臟&#xff0c;其性能的穩定與高效直接關系到設備的運行質量與使用安全。隨著電動汽車、可穿戴設備、儲能系統等領域的快速發展&#xff0c;對電池性能的檢測與評估提出了更高要求。在此背景下&#xff0c;電…

【Linux 22.4 ubuntu 安裝cuda12.1 完整方案】

下載cuda12.1 官網網址 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.run!import! 如果已經安裝驅動&#xff0c;則不要選擇dirver那項 添加環境變量 vim ~/.b…

實戰案例分享:Android WLAN Hal層移植(MTK+QCA6696)

本文將詳細介紹基于MTK平臺&#xff0c;適配高通&#xff08;Qualcomm&#xff09;QCA6696芯片的Android WLAN HAL層的移植過程&#xff0c;包括HIDL接口定義、Wi-Fi驅動移植以及wpa_supplicant適配過程&#xff0c;涵蓋STA與AP模式的常見問題與解決方法。 1. HIDL接口簡介 HID…

Greenplum6.19集群搭建

一&#xff0c;安裝說明 1.1環境說明 1、首先確定部署的環境&#xff0c;確定下服務器的端口&#xff0c;一般默認是22的端口&#xff1b; 2、當前這份文檔是服務器處于10022端口下部署的&#xff08;現場生產環境要求&#xff0c;22端口在生產環境存在安全隱患&#xff09;&…

電商項目-秒殺系統(四)秒殺異步下單防止重復秒殺

一、 防止惡意刷單解決 在生產場景下&#xff0c;可能會有一些人會惡意訪問當前網站&#xff0c;來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂&#xff0c;出現臟數據&#xff0c;或者造成后端訪問壓力大等問題。 一般要解決這個問題的話&#xff0c;前端可…

原生android 打包.aar到uniapp使用

1.原生安卓里面引入uniapp官方提供的包文件&#xff1a; uniapp-v8-release.aar 2.提供uniapp調用的接口&#xff0c;新建類文件繼承UniModule&#xff0c; package com.dermandar.panoramal;import com.scjt.lib.certlib;import io.dcloud.feature.uniapp.annotation.UniJSM…

Android 多用戶相關

Android 多用戶相關 本文主要記錄下android 多用戶相關的adb 命令操作. 1: 獲取用戶列表 命令: adb shell pm list users 輸出如下: Users:UserInfo{0:機主:c13} running默認只有一個用戶, id為0 &#xff0c;用戶狀態為運行 2: 創建新用戶 命令&#xff1a; adb shell …

基于Spring Boot的高校就業招聘系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

前端安全面試題匯總及參考答案

目錄 簡述 XSS 攻擊的原理及三種常見類型(存儲型、反射型、DOM 型) 如何在前端防御 XSS 攻擊?列舉編碼、過濾、CSP 策略的具體實現方式 富文本編輯器場景下如何安全處理用戶輸入的 HTML 內容? 如何通過 HttpOnly 屬性增強 Cookie 安全性?它與 XSS 防御的關系是什么? …

Linux驅動開發(1.基礎創建)

序言&#xff1a;從高層邏輯到底層硬件的回歸 在當今的軟件開發中&#xff0c;我們習慣于用高級語言構建抽象層——通過框架、庫和云服務快速實現功能。這種“軟邏輯”的便利性讓開發效率倍增&#xff0c;卻也逐漸模糊了我們對計算機本質的認知&#xff1a;一切代碼終將落地為…

Gradle本地配置文件分享

Gradle本地配置文件分享 allprojects {repositories {mavenLocal()maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }maven { name "Bstek" ; url "https://nexus.bsdn.org/content/groups/public/" }ma…

deepseek 本地部署

deepseek 本地部署 純新手教學&#xff0c;手把手5分鐘帶你在本地部署一個私有的deepseek&#xff0c;再也不用受網絡影響。流暢使用deepseek&#xff01;&#xff01;&#xff01; 如果不想看文章&#xff0c;指路&#xff1a;Deep seek R1本地部署 小白超詳細教程 &#xff0…

HTML學習筆記(全)

基本結構 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title></title> </head> <body></body> </html> 基本標簽元素 標題&#xff08;heading&#xff09; <h1>一級標題</h1> &…

騰訊云對象存儲服務(COS)

騰訊云對象存儲服務&#xff08;COS&#xff09; 安全、可擴展、低成本的云存儲解決方案 騰訊云 對象存儲服務&#xff08;COS&#xff0c;Cloud Object Storage&#xff09; 是一種高可靠、高性能、可擴展的云存儲服務&#xff0c;專為海量非結構化數據&#xff08;如圖片、…

從ETL到數倉分層:大數據處理的“金字塔”構建之道

在當今數據驅動的時代&#xff0c;大數據處理已成為企業決策和業務優化的核心。而ETL&#xff08;Extract, Transform, Load&#xff09;作為數據處理的基石&#xff0c;其背后的數倉分層理念更是決定了數據處理的效率與質量。本文將深入探討ETL工作中的數倉分層理念&#xff0…