当前位置: 首页 > news >正文

全面掌握 Jackson 序列化工具:原理、使用与高级配置详解

全面掌握 Jackson 序列化工具:原理、使用与高级配置详解

Jackson 是一个功能强大的 JSON 处理库,广泛应用于 Java 项目中。它提供了丰富的功能和灵活的配置选项,可以轻松地在 Java 对象和 JSON 数据之间进行转换。本文将详细介绍 Jackson 的核心概念、基本用法、高级配置及处理集合类型的数据,旨在帮助你全面掌握 Jackson 的使用方法。

一、Jackson 的核心概念

1. ObjectMapper

ObjectMapper 是 Jackson 的核心类,负责将 Java 对象转换为 JSON 以及将 JSON 转换为 Java 对象。它提供了许多方法来处理这些操作,例如 writeValue、readValue 等。

2. JsonParser 和 JsonGenerator

  • JsonParser:低级别的 JSON 解析器,用于逐步解析 JSON 内容。
  • JsonGenerator:低级别的 JSON 生成器,用于逐步生成 JSON 内容。

3. Annotations

Jackson 提供了许多注解来定制序列化和反序列化过程,包括但不限于:

  • @JsonProperty:指定字段的 JSON 名称。
  • @JsonIgnore:忽略字段。
  • @JsonFormat:格式化日期和时间。
  • @JsonInclude:指定包含的条件。

二、添加依赖

在你的项目中添加 Jackson 依赖。以 Maven 为例:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version>
</dependency>

对于 Gradle 项目:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'

三、基本用法

1. 序列化和反序列化

以下示例展示了如何使用 ObjectMapper 序列化和反序列化 Java 对象:

import com.fasterxml.jackson.databind.ObjectMapper;public class JacksonExample {public static void main(String[] args) {try {ObjectMapper objectMapper = new ObjectMapper();// 创建一个对象User user = new User();user.setName("John");user.setAge(30);// 序列化:Java 对象 -> JSON 字符串String jsonString = objectMapper.writeValueAsString(user);System.out.println("JSON String: " + jsonString);// 反序列化:JSON 字符串 -> Java 对象User deserializedUser = objectMapper.readValue(jsonString, User.class);System.out.println("Deserialized User: " + deserializedUser);} catch (Exception e) {e.printStackTrace();}}
}class User {private String name;private int age;// getters and setterspublic 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;}@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + '}';}
}

2. 使用注解定制序列化和反序列化

Jackson 提供了许多注解来定制序列化和反序列化过程。例如:

  • @JsonProperty:用于指定 JSON 字段名。
  • @JsonIgnore:用于忽略某个字段。
  • @JsonFormat:用于指定日期格式。
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonFormat;import java.util.Date;class User {@JsonProperty("full_name")private String name;@JsonIgnoreprivate int age;@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")private Date birthDate;// getters and setterspublic 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;}public Date getBirthDate() {return birthDate;}public void setBirthDate(Date birthDate) {this.birthDate = birthDate;}@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "', birthDate=" + birthDate + '}';}
}

使用上述类,生成的 JSON 将如下所示:

{"full_name": "John","birthDate": "25-12-1990"
}

3. 高级配置

可以通过配置 ObjectMapper 来自定义其行为。例如:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 格式化输出
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性

这些配置允许你格式化输出 JSON 和忽略未知属性。

四、处理复杂对象

Jackson 还可以处理复杂对象和集合类型。

1. 处理嵌套对象

class Address {private String street;private String city;// getters and setterspublic String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}class User {private String name;private int age;private Address address;// getters and setterspublic 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;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + ", address=" + address + '}';}
}

2. 处理集合类型

以下示例展示了如何处理包含复杂对象的集合类型(List、Map 等)。

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.ArrayList;
import java.util.List;public class JacksonCollectionExample {public static void main(String[] args) {try {ObjectMapper objectMapper = new ObjectMapper();// 创建用户列表List<User> userList = new ArrayList<>();userList.add(new User("John Doe", 30));userList.add(new User("Jane Doe", 25));// 序列化用户列表:Java 对象 -> JSON 字符串String userListJson = objectMapper.writeValueAsString(userList);System.out.println("User List JSON:\n" + userListJson);// 反序列化用户列表:JSON 字符串 -> Java 对象List<User> deserializedUserList = objectMapper.readValue(userListJson, new TypeReference<List<User>>(){});System.out.println("Deserialized User List:\n" + deserializedUserList);// 创建组对象Group group = new Group("Admins", userList);// 序列化组对象:Java 对象 -> JSON 字符串String groupJson = objectMapper.writeValueAsString(group);System.out.println("Group JSON:\n" + groupJson);// 反序列化组对象:JSON 字符串 -> Java 对象Group deserializedGroup = objectMapper.readValue(groupJson, Group.class);System.out.println("Deserialized Group:\n" + deserializedGroup);} catch (Exception e) {e.printStackTrace();}}
}class Group {private String groupName;private List<User> users;// Constructorspublic Group() {}public Group(String groupName, List<User> users) {this.groupName = groupName;this.users = users;}// Getters and Setterspublic String getGroupName() {return groupName;}public void setGroupName(String groupName) {this.groupName = groupName;}public List<User> getUsers() {return users;}public void setUsers(List<User> users) {this.users = users;}@Overridepublic String toString() {return "Group{groupName='" + groupName + "', users=" + users + '}';}
}

代码解析

1. 创建用户列表

List<User> userList = new ArrayList<>();
userList.add(new User("John Doe", 30));
userList.add(new User("Jane Doe", 25));

创建一个包含两个 User 对象的 ArrayList。

2. 序列化用户列表

String userListJson = objectMapper.writeValueAsString(userList);
System.out.println("User List JSON:\n" + userListJson);

使用 ObjectMapper 将用户列表序列化为 JSON 字符串。

3. 反序列化用户列表

List<User> deserializedUserList = objectMapper.readValue(userListJson, new TypeReference<List<User>>(){});
System.out.println("Deserialized User List:\n" + deserializedUserList);

使用 ObjectMapper 将 JSON 字符串反序列化为 List。注意 TypeReference 用于处理泛型类型。

4. 创建组对象

Group group = new Group("Admins", userList);

创建一个 Group 对象,其中包含一个组名和用户列表。

5. 序列化组对象

String groupJson = objectMapper.writeValueAsString(group);
System.out.println("Group JSON:\n" + groupJson);

使用 ObjectMapper 将组对象序列化为 JSON 字符串。

6. 反序列化组对象

Group deserializedGroup = objectMapper.readValue(groupJson, Group.class);
System.out.println("Deserialized Group:\n" + deserializedGroup);

使用 ObjectMapper 将 JSON 字符串反序列化为 Group 对象。

五、总结

通过上述内容,我们详细介绍了 Jackson 的基本概念、用法、高级配置以及处理复杂对象和集合类型的示例。掌握这些技术,可以在实际项目中高效地使用 Jackson 处理 JSON 数据。

Jackson 是一个强大且灵活的工具,能够满足各种 JSON 处理需求。希望本教程能够帮助你更好地理解和使用 Jackson。

相关文章:

全面掌握 Jackson 序列化工具:原理、使用与高级配置详解

全面掌握 Jackson 序列化工具&#xff1a;原理、使用与高级配置详解 Jackson 是一个功能强大的 JSON 处理库&#xff0c;广泛应用于 Java 项目中。它提供了丰富的功能和灵活的配置选项&#xff0c;可以轻松地在 Java 对象和 JSON 数据之间进行转换。本文将详细介绍 Jackson 的…...

mathtype7.4永久激活码密钥及2024最新破解版注册码附安装教程

MathType 7版本号还提升了对教育行业的支持&#xff0c;如增加了大量预定义的教学公式和符号&#xff0c;使老师和学生在教学过程中能够更加便捷的应用。同时&#xff0c;它还加强了云备份功能&#xff0c;用户可将自己的公式存储在云端&#xff0c;随时随地访问和编辑&#xf…...

【SQL】优化慢 SQL的简单思路

优化慢 SQL 需要综合考虑多个方面&#xff0c;包括查询的结构、索引的使用、表结构设计等。以下是一些常见的 SQL 优化技巧和步骤&#xff1a; 1. 检查查询计划 使用数据库提供的工具查看查询计划&#xff08;例如 MySQL 的 EXPLAIN 命令&#xff09;可以帮助了解查询的执行路…...

禁止浏览器对input的自动填充和填充提示(适用于谷歌、火狐、Edge(原IE浏览器)等常见浏览器)

目录 1.要解决的问题2.一技能&#xff1a;原生属性&#xff0c;小试牛刀3.二技能&#xff1a;傀儡input&#xff0c;瞒天过海4.三技能&#xff1a;JavaScript出击&#xff0c;直接开大5.九九八十一难&#xff0c;永远还有最后一难 写在前面&#xff1a; 如有转载&#xff0c;务…...

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…...

深入浅出:npm常用命令详解和实践

npm 是 Node.js 的包管理器&#xff0c;用于管理 Node.js 应用的依赖关系和版本。 以下是一些常用的 npm 命令&#xff1a; npm init: 命令用于初始化一个新的 Node.js 项目。它会创建一个 package.json 文件&#xff0c;这个文件包含了项目的元数据和依赖信息。 npm initnpm…...

山东大学-科技文献阅读与翻译(期末复习)(选择题+翻译)

目录 选择题 Chapter1 1.which of the following is not categorized as scientific literature 2.Which of the followings is defined as tertiary(三级文献) literature? 3.Which type of the following international conferences is listed as Number one conference…...

二分查找:自定义 upper_bound、lower_bound

二分查找详细介绍可以看这篇文章&#xff0c;此篇文章介绍返回索引的 upper_bound 和 lower_bound 的 C 实现。 lower_bound 实现代码 #include <vector>int lower_bound_index(const std::vector<int>& vec, const int& target) {int left 0;int right…...

Java 搭建个人博客基本框架

为了实现一个功能完善的个人博客系统&#xff0c;我们将使用Spring Boot作为框架&#xff0c;MySQL作为数据库&#xff0c;并引入Spring Security来处理用户认证和授权。以下是系统的详细设计和实现步骤&#xff1a; ## 项目结构 - src/main/java/com/blog - controller …...

停车场智能化管理:车位引导系统实现车位资源优化与数据分析

随着城市汽车保有量的不断增长&#xff0c;停车难问题日益凸显。尤其是在高峰时段&#xff0c;寻找停车位和取车成为了许多车主的头疼问题。为了解决这一难题&#xff0c;维小帮智能车位引导系统应运而生&#xff0c;它利用先进的技术手段&#xff0c;帮助车主快速找到停车位&a…...

梯度下降法

梯度下降法是一种在机器学习和深度学习中广泛使用的优化算法。它用于最小化某个函数&#xff0c;通常是损失函数或成本函数&#xff0c;通过迭代调整参数来找到函数的最小值点。梯度下降法的基本思想是从一个初始参数出发&#xff0c;沿着损失函数梯度&#xff08;导数&#xf…...

【高考志愿】光学工程

目录 一、专业概述 二、专业特点 三、研究和就业方向 3.1 研究方向 3.2 就业方向 四、光学工程专业排名 高考志愿选择光学工程专业无疑是一项既具深度又富挑战性的明智之举。这个古老而充满魅力的专业&#xff0c;正逐渐崭露其在现代社会中的重要性与独特魅力。 一、专业…...

Golang | Leetcode Golang题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; func isIsomorphic(s, t string) bool {s2t : map[byte]byte{}t2s : map[byte]byte{}for i : range s {x, y : s[i], t[i]if s2t[x] > 0 && s2t[x] ! y || t2s[y] > 0 && t2s[y] ! x {return false}s2t[x] yt2s[y] …...

【Unity】RPG2D龙城纷争(五)关卡编辑器之地图编辑

更新日期:2024年6月25日。 项目源码:本章发布 索引 简介关卡编辑器窗口类(LevelEditor)一、定义关卡编辑器窗口类二、两种编辑模式三、地块编辑模式1.关卡模板2.打开编辑窗口3.编辑器基本属性4.地块模板5.重新生成地图6.地图刷子7.刷地块源码链接简介 关卡编辑器将是我们配…...

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

基于深度学习的人脸关键点检测

1. 任务和目标 人脸关键点检测的主要任务是识别并定位人脸图像中的特定关键点&#xff0c;例如眼睛的角点、眉毛的顶点、鼻子的底端、嘴角等。这些关键点不仅能提供面部结构的几何信息&#xff0c;还可以用于分析表情、识别个体&#xff0c;甚至检测面部姿势。 2. 技术和方法…...

C++自定义智能指针

template <class T> class counted_ptr;// 智能指针引用计数类 template <class T> class Ref_Ptr {friend class counted_ptr<T>; private:T* m_pTtr; // 实际的指针size_t counted_ptr; // 引用计数Ref_Ptr(T* p);virtual ~Ref_Ptr(); };template <clas…...

一个合理的前端应用文件结构

在大型应用中&#xff0c;最关键且最具挑战性的方面之一就是拥有一个良好且合理的文件结构。在考虑通过微前端将代码库拆分成多个应用之前&#xff0c;可以遵循一些步骤来改善项目级别的架构&#xff0c;并在您考虑这一路径时使过渡更容易。 我们的目标是应用某种模块化方法&am…...

spring和springboot的关系是什么?

大家好&#xff0c;我是网创有方的站长&#xff0c;今天给大家分享下spring和springboot的关系是什么&#xff1f; Spring和Spring Boot之间的关系可以归纳为以下几个方面&#xff1a; 技术基础和核心特性&#xff1a; Spring&#xff1a;是一个广泛应用的开源Java框架&#…...

智慧校园-医务管理系统总体概述

智慧校园医务管理系统&#xff0c;作为校园健康管理体系的智能化升级&#xff0c;深度融合信息技术与医疗服务&#xff0c;为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标&#xff0c;通过一系列创新功能&#xff0c;确…...

抖音无水印视频批量下载全攻略:技术解析与实战指南

抖音无水印视频批量下载全攻略&#xff1a;技术解析与实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

s2-pro实战落地:跨境电商产品介绍多语种语音批量生成

s2-pro实战落地&#xff1a;跨境电商产品介绍多语种语音批量生成 1. 场景痛点与解决方案 跨境电商企业面临一个共同挑战&#xff1a;如何高效地为全球不同语言市场的产品生成专业语音介绍。传统方案需要雇佣多语种配音人员&#xff0c;成本高、周期长&#xff0c;且难以保证语…...

STEP3-VL-10B实际作品集:MMBench 92.05分视觉识别能力高清图文输出示例

STEP3-VL-10B实际作品集&#xff1a;MMBench 92.05分视觉识别能力高清图文输出示例 1. 引言&#xff1a;当AI“看懂”了世界 你有没有想过&#xff0c;让AI像人一样“看懂”一张图片&#xff0c;到底有多难&#xff1f; 这不仅仅是识别出图片里有什么东西那么简单。比如给你…...

马西奎《电磁场与电磁波》学习记录-第 2 章学前准备-坐标系的深入 + 微分元(dl、dS、dV)

一、正交坐标系的一般概念1. 什么是正交曲线坐标系三组坐标面互相垂直正交单位矢量处处正交&#xff1a;​⊥​⊥​直角、圆柱、球坐标都属于这一类。2. 坐标变量与拉梅系数&#xff08;度量系数&#xff09;对一般正交曲线坐标 (,​,​)&#xff1a;坐标面&#xff1a;​常数、…...

S2-Pro模型管理利器:Ollama国内镜像源加速下载与使用

S2-Pro模型管理利器&#xff1a;Ollama国内镜像源加速下载与使用 1. 为什么需要国内镜像源 如果你在国内使用Ollama管理S2-Pro等大模型&#xff0c;可能经常遇到下载速度慢、连接不稳定甚至完全无法拉取模型的问题。这是因为默认的模型仓库位于海外服务器&#xff0c;受网络环…...

Fay数字人框架终极指南:30分钟打造你的AI虚拟助手

Fay数字人框架终极指南&#xff1a;30分钟打造你的AI虚拟助手 【免费下载链接】Fay Fay 是一个开源的数字人类框架&#xff0c;集成了语言模型和数字字符。它为各种应用程序提供零售、助手和代理版本&#xff0c;如虚拟购物指南、广播公司、助理、服务员、教师以及基于语音或文…...

保姆级避坑指南:用YOLOX和ByteTrack在Windows上实现多目标跟踪(附完整代码修改)

Windows平台实战&#xff1a;YOLOX与ByteTrack多目标跟踪避坑全攻略 刚接触多目标跟踪的研究生小王盯着屏幕上的报错信息已经三小时了——明明按照GitHub教程一步步操作&#xff0c;却在运行demo_track.py时遭遇了编码错误、CUDA版本不匹配和依赖冲突的连环暴击。这场景你是否熟…...

MATLAB图像处理实战:5分钟搞定腐蚀膨胀操作(附完整代码)

MATLAB图像形态学处理实战&#xff1a;从原理到代码实现 在数字图像处理领域&#xff0c;形态学操作就像一把精密的"手术刀"&#xff0c;能够对图像进行精细的"雕刻"和"修饰"。无论是去除噪点、填补空洞&#xff0c;还是分离粘连物体&#xff0c…...

【刚性 PINN 与时间自适应策略】第九章:综合案例实战:刚性化学反应动力学模拟

目录 9.1 问题描述与数据生成 9.1.1 Robertson 刚性化学反应模型构建 9.1.2 传统 PINN 的失败复现与诊断 第二部分:代码实现 9.1.1.1 三组分反应方程组及其刚性特征分析 9.1.1.2 基准解的生成(使用隐式求解器) 9.1.2.1 训练损失曲线与预测结果的偏差可视化 9.1.2.2 …...

老旧Mac重获新生:OpenCore Legacy Patcher如何突破苹果硬件限制

老旧Mac重获新生&#xff1a;OpenCore Legacy Patcher如何突破苹果硬件限制 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当你的Mac因官方不再支持而无法更新系统&#…...