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 采用模块化设计,核心模块包括:
jackson-core
:- 提供底层 JSON 解析和生成功能。
- 包含
JsonParser
(解析 JSON)和JsonGenerator
(生成 JSON)。
jackson-annotations
:- 提供丰富的注解,用于控制 JSON 的序列化和反序列化行为。
jackson-databind
:- 提供高级数据绑定功能,将 JSON 数据与 Java 对象相互转换。
jackson-dataformat-xml
:- 支持 XML 格式的序列化和反序列化。
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 自定义序列化和反序列化
通过实现 JsonSerializer
和 JsonDeserializer
,可以自定义序列化和反序列化逻辑。
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. 注意事项
- 性能优化:
- 重用
ObjectMapper
实例,避免重复创建。
- 重用
- 安全性:
- 反序列化时,避免直接反序列化不可信的 JSON 数据,防止反序列化攻击。
- 版本兼容性:
- 确保
jackson-core
、jackson-annotations
和jackson-databind
的版本一致。
- 确保
- 空值处理:
- 使用
@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. 对比与总结
特性 | Fastjson | org.json | json-simple |
---|---|---|---|
性能 | 高性能,适合大数据量处理 | 性能一般 | 性能一般 |
功能性 | 功能强大,支持复杂对象 | 功能齐全 | 功能基础 |
易用性 | API设计简单,易于上手 | API设计简单,适合初学者 | API设计简洁,快速上手 |
体积 | 较大 | 较小 | 较小 |
结论:
- 如果需要处理大量的JSON数据,并且对性能有较高要求,Fastjson 是最佳选择。
- 如果需要一个轻量级且功能齐全的JSON库,org.json 是一个不错的选择。
- 如果只需要快速处理简单的JSON数据,json-simple 是最简单的选择。
5. 注意事项
- Fastjson的安全性:Fastjson在过去曾被发现存在一些安全漏洞,建议使用最新版本并关注官方更新。
- 库的选择:根据项目需求和开发环境选择合适的JSON库,避免过度依赖单一库。
使用前导入对应的库:
6. 总结
Jackson 是 Java 生态中最强大的 JSON 处理库,提供了高效、灵活的序列化和反序列化功能。通过合理使用注解和高级特性,可以满足各种复杂的 JSON 处理需求。无论是 RESTful API、数据存储还是数据传输,Jackson 都是不可或缺的工具。
相关文章:
Jackson 详解
目录 前言 Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介…...

游戏引擎学习第143天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并规划今天的内容 目前,我们正在进行声音混合的开发。我们已经写好了声音混合器,并且已经实现了一些功能,比如声音流播放和音量插值。过去一周我们做了很多工作,进展非常快。不…...

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决
介绍一下我的是ubuntu20.04.机载电脑是orinnx,通过源码烧写的系统。 首先打开终端,输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容, ONNX(Open Neural Network E…...
Nginx解决前端跨域问题
1. 理解 CORS 和同源策略 1.1 同源策略 同源策略是一种浏览器安全机制,用于阻止不同源(不同域名、协议或端口)的 Web 应用相互访问数据。它确保了 Web 应用的隔离性,防止恶意网站访问用户数据或执行不安全的操作。 同源策略下&…...

ReferenceError: assignment to undeclared variable xxx
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

国产编辑器EverEdit - 宏功能介绍
1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器,可以让用户愉快的从繁琐的工作中解放出来,其本质是对键盘和菜单的操作序列的录制,并不会识别文件的内容,属于无差别无脑执行。 特别是对一些有规律的重复按键动作,…...

图像滑块对比功能的开发记录
背景介绍 最近,公司需要开发一款在线图像压缩工具,其中的一个关键功能是让用户直观地比较压缩前后的图像效果。因此,我们设计了一个对比组件,它允许用户通过拖动滑块,动态调整两张图像的显示区域,从而清晰…...
【计算机网络】Socket
Socket 是网络通信的核心技术之一,充当应用程序与网络协议栈之间的接口。 1. Socket 定义 Socket(套接字)是操作系统提供的 网络通信抽象层,允许应用程序通过标准接口(如 TCP/IP 或 UDP)进行数据传输。它…...
Electron应用中获取设备唯一ID和系统信息
让我创建一篇关于如何在Electron应用中获取设备唯一ID和系统信息,并在登录时使用这些信息的博客文章。我将确保步骤明确、条理清晰,适合初学者和有经验的开发者。 这篇博客应包含以下部分: 介绍 - 为什么需要获取设备信息前提条件和安装依赖…...

文件上传漏洞:upload-labs靶场11-20
目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 ,发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…...

国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡
基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于 FPGAJFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持PXIE标准协议,其中XJ3…...

使用Open WebUI下载的模型文件(Model)默认存放在哪里?
🏡作者主页:点击! 🤖Ollama部署LLM专栏:点击! ⏰️创作时间:2025年2月21日21点21分 🀄️文章质量:95分 文章目录 使用CMD安装存放位置 默认存放路径 Open WebUI下…...

FPGA 配置原理
用户编程控制的FPGA 是通过加载比特位流配置内部的存储单元实现的。该存储单元就是所谓的配置单元,它必须在器件上电后进行配置,从而设置查找表(LUT)的属性、连线方式、IOB 电压标准和其它的用户设计。 1.配置帧 以Xilinx 公司的…...

企业级虚拟化数据库基础平台自动化部署项目
一、项目简介及准备工作 1.1.虚拟化平台简介 1.1.1.ESXi 8 是什么? 定义: ESXi 8 是 VMware 推出的最新版本 裸机虚拟化管理程序(Hypervisor),属于 VMware vSphere 产品线的核心组件。 核心功能: 在物理…...
关于elementui的时间组件与后端时间和oracle数据库时间的对应格式
前端: <el-date-pickerv-model"formInline.startTime"type"date"value-format"yyyy-MM-dd"placeholder"选择日期"> </el-date-picker> 后端: private String startTime; private String endTime…...

一周学会Flask3 Python Web开发-WTForms表单验证
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们可以通过WTForms表单类属性的validators属性来实现表单验证。 常用的WTForms验证器 验证器说明DataRequired(messageNo…...

qt open3dBPA重建
qt open3dBPA重建 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionBPA_triggered();//bpa重建 void MainWindow::...
Unity游戏开发中的网格简化与LOD技术(Mesh Simplification LOD)
在Unity游戏开发中,网格简化(Mesh Simplification)和LOD(Level of Detail)技术是优化渲染性能的关键手段,尤其在处理复杂场景和高精度模型时至关重要。以下是一套系统的实现方案与优化策略: 一、…...

基于YOLO11深度学习的运动品牌LOGO检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

纯html文件实现目录和文档关联
目录结构 效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>项目结题报告</title><style lang"scss">::-webkit-scrollbar {width: 6px;height: 6px;}::-webkit-scro…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...