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

【Java 进阶篇】揭秘 Jackson:Java 对象转 JSON 注解的魔法

在这里插入图片描述

嗨,亲爱的同学们!欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 注解的详细解析指南。JSON(JavaScript Object Notation)是一种常用于数据交换的轻量级数据格式,而 Jackson 作为一款优秀的 JSON 解析库,通过注解提供了便捷而强大的方式,让我们能够更自由地掌控 Java 对象与 JSON 之间的转换。在这篇博客中,我将带你一探 Jackson 注解的奇妙世界,通过示例代码揭秘 Java 对象转 JSON 注解的魔法!

什么是 Jackson 注解?

在开始之前,让我们先简要了解一下 Jackson 注解是什么。

Jackson 注解是一组用于配置 Java 对象序列化和反序列化过程的注解。通过在 Java 类或字段上添加这些注解,我们可以指导 Jackson 如何处理 JSON 转换。这为我们提供了极大的灵活性,让我们能够通过注解方式定制化 JSON 转换过程,满足不同的需求。

基本注解:@JsonProperty

首先,让我们介绍最基本的注解之一:@JsonProperty。这个注解用于指定 JSON 字符串中的字段名与 Java 对象中的字段名之间的映射关系。

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonPropertyExample {public static void main(String[] args) throws Exception {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建一个包含 @JsonProperty 注解的对象JsonPropertyObject jsonPropertyObject = new JsonPropertyObject("Alice", 25);// 将对象序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(jsonPropertyObject);// 输出结果System.out.println(jsonString);}
}

在这个例子中,JsonPropertyObject 类的字段 name 被注解为 @JsonProperty("fullName"),这意味着在序列化为 JSON 字符串时,字段 name 将以 "fullName" 作为键。输出结果应该是类似于 {"fullName":"Alice","age":25} 的字符串。

定制化日期格式:@JsonFormat

在处理日期类型时,我们常常需要定制化日期的格式。这时,@JsonFormat 就派上用场了。

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.Date;public class JsonFormatExample {public static void main(String[] args) throws Exception {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建包含 @JsonFormat 注解的对象JsonFormatObject jsonFormatObject = new JsonFormatObject(new Date());// 将对象序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(jsonFormatObject);// 输出结果System.out.println(jsonString);}
}

在这个例子中,JsonFormatObject 类的字段 birthDate 被注解为 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd"),这表示在序列化为 JSON 字符串时,birthDate 将以指定的日期格式呈现。输出结果应该是类似于 {"birthDate":"2023-01-01"} 的字符串。

忽略字段:@JsonIgnore

有时候,我们希望在序列化或反序列化过程中忽略某些字段,这时可以使用 @JsonIgnore 注解。

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonIgnoreExample {public static void main(String[] args) throws Exception {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建包含 @JsonIgnore 注解的对象IgnoreFieldObject ignoreFieldObject = new IgnoreFieldObject("Sensitive Data", "Normal Data");// 将对象序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(ignoreFieldObject);// 输出结果System.out.println(jsonString);}
}

在这个例子中,IgnoreFieldObject 类的字段 sensitiveData 被注解为 @JsonIgnore,这表示在序列化为 JSON 字符串时,sensitiveData 字段将被忽略。输出结果应该是类似于 {"normalData":"Normal Data"} 的字符串。

支持枚举:@JsonEnumDefaultValue

在处理枚举类型时,我们可能会遇到枚举值新增但尚未在代码中处理的情况。这时,@JsonEnumDefaultValue 注解可以帮助我们处理未知的枚举值。

import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
import com.fasterxml.jackson.databind.ObjectMapper;public class JsonEnumDefaultValueExample {public static void main(String[] args) throws Exception {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建包含 @JsonEnumDefaultValue 注解的对象EnumDefaultValueObject enumDefaultValueObject = new EnumDefaultValueObject(EnumWithDefault.UNKNOWN);// 将对象序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(enumDefaultValueObject);// 输出结果System.out.println(jsonString);}
}

在这个例子中,EnumDefaultValueObject 类的字段 enumValue 被注解为 @JsonEnumDefaultValue,并且指定了默认值为 EnumWithDefault.UNKNOWN。这意味着在序列化为 JSON 字符串时,如果枚举值未知,将使用默认值 UNKNOWN

定制化序列化与反序列化:@JsonSerialize@JsonDeserialize

有时候,我们可能需要对字段进行更复杂的序列化或反序列化操作,这时可以使用 @JsonSerialize@JsonDeserialize 注解。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;public class JsonSerializeDeserializeExample {public static void main(String[] args) throws Exception {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建包含 @JsonSerialize 和 @JsonDeserialize 注解的对象SerializeDeserializeObject serializeDeserializeObject = new SerializeDeserializeObject("customValue");// 将对象序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(serializeDeserializeObject);// 输出结果System.out.println(jsonString);// 将 JSON 字符串反序列化为对象SerializeDeserializeObject deserializedObject = objectMapper.readValue(jsonString, SerializeDeserializeObject.class);// 输出反序列化结果System.out.println(deserializedObject.getCustomValue());}
}

在这个例子中,SerializeDeserializeObject 类的字段 customValue 被注解为 @JsonSerialize(using = CustomSerializer.class)@JsonDeserialize(using = CustomDeserializer.class)。这意味着在序列化时将使用自定义的序列化器 CustomSerializer,而在反序列化时将使用自定义的反序列化器 CustomDeserializer

嵌套对象处理:@JsonManagedReference@JsonBackReference

当对象之间存在双向关系时,为了防止无限递归的序列化问题,我们可以使用 @JsonManagedReference@JsonBackReference 注解。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonBackReference;
import com.fasterxml.jackson.databind.annotation.JsonManagedReference;public class JsonReferenceExample {public static void main(String[] args) throws Exception {// 创建一个 ObjectMapper 对象ObjectMapper objectMapper = new ObjectMapper();// 创建包含 @JsonManagedReference 和 @JsonBackReference 注解的对象ReferenceParent parent = new ReferenceParent("Parent");ReferenceChild child = new ReferenceChild("Child", parent);// 设置对象间的关系parent.setChild(child);// 将对象序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(parent);// 输出结果System.out.println(jsonString);}
}

在这个例子中,ReferenceParent 类的字段 child 被注解为 @JsonManagedReference,而 ReferenceChild 类的字段 parent 被注解为 @JsonBackReference。这样,序列化时将优先处理 @JsonManagedReference,而忽略 @JsonBackReference,从而避免了无限递归的问题。

小结

通过本文的介绍,我们深入探讨了 Jackson JSON 解析器中 Java 对象转 JSON 注解的强大功能。从基本的 @JsonProperty 到复杂的 @JsonSerialize@JsonDeserialize,再到处理对象间关系的 @JsonManagedReference@JsonBackReference,Jackson 提供了丰富的注解来满足各种需求。希望本文能够帮助你更好地理解和使用 Jackson 注解,让 JSON 转换变得更加得心应手!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Java 进阶篇】揭秘 Jackson:Java 对象转 JSON 注解的魔法

嗨,亲爱的同学们!欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 注解的详细解析指南。JSON(JavaScript Object Notation)是一种常用于数据交换的轻量级数据格式,而 Jackson 作为一款优秀的 JSON 解析库&am…...

②【Hash】Redis常用数据类型:Hash [使用手册]

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis Hash ②Redis Hash 操作命令汇总1. hset…...

十七、SpringAMQP

目录 一、SpringAMQP的介绍: 二、利用SpringAMQP实现HelloWorld中的基础消息队列功能 1、因为publisher和consumer服务都需要amqp依赖,因此这里把依赖直接放到父工程mq-demo中 2、编写yml文件 3、编写测试类,并进行测试 三、在consumer…...

Java虚拟机(JVM)的调优技巧和实战

JVM是Java应用程序的运行环境,它负责管理Java应用程序的内存分配、垃圾收集等重要任务。然而,JVM的默认设置并不总是适合所有应用程序,因此需要根据应用程序的需求进行调优。通过对JVM进行调优,可以大大提高Java应用程序的性能和可…...

idea中的sout、psvm快捷键输入,不要太好用了

目录 一、操作环境 二、psvm、sout 操作介绍 2.1 psvm,快捷生成main方法 2.2 sout,快捷生成打印方法 三、探索 psvm、sout 底层逻辑 一、操作环境 语言:Java 工具: 二、psvm、sout 操作介绍 2.1 psvm,快捷生成m…...

shell脚本字典创建遍历打印

解释: 代码块中包含了每个用法的详细解释 #!/bin/bash# 接收用户输入的两个数 echo "请输入第一个数:" read num1 echo "请输入第二个数:" read num2# 创建一个关联数组 declare -A dict1 declare -A dict2# 定义键和值…...

【设计模式】聊聊职责链模式

原理和实现 模板模式变化的是其中一个步骤,而责任链模式变化的是整个流程。 将请求的发送和接收解耦合,让多个接收对象有机会可以处理这个请求,形成一个链条。不同的处理器负责自己不同的职责。 定义接口 public interface Filter {/*** …...

【C++进阶之路】第五篇:哈希

文章目录 一、unordered系列关联式容器1.unordered_map(1)unordered_map的介绍(2)unordered_map的接口说明 2. unordered_set3.性能对比 二、底层结构1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决(1)闭散…...

CentOS基Docker容器时区配置解决方案

配置Docker容器的时区对于确保应用程序正确处理日期和时间至关重要。当使用CentOS作为基础镜像时,可以通过以下两种方法配置时区: 方法一:在Dockerfile中设置时区 这种方法涉及在构建Docker镜像的过程中设置时区。 步骤 选择基础镜像&…...

探索 Material 3:全新设计系统和组件库的介绍

探索 Material 3:全新设计系统和组件库的介绍 一、Material 3 简介1.1 Material 3 的改进和更新1.2 Material 3 的优势特点 二、Material 3 主题使用2.1 使用 Material3 主题2.2 使用 Material3 主题颜色 三、Material 3 组件使用3.1 MaterialButton:支持…...

《多GPU大模型训练与微调手册》

全参数微调 Lora微调 PTuning微调 多GPU微调预备知识 1. 参数数据类型 torch.dtype 1.1 半精度 half-precision torch.float16:fp16 就是 float16,1个 sign(符号位),5个 exponent bits(指数位),10个 ma…...

【C++】const与类(const修饰函数的三种位置)

目录 const基本介绍 正文 前: 中: 后: 拷贝构造使用const 目录 const基本介绍 正文 前: 中: 后: 拷贝构造使用const const基本介绍 const 是 C 中的修饰符,用于声明常量或表示不可修改的对象、函数或成员函数。 我们已经了解了const基本用法,我们先进行…...

深度学习在图像识别中的革命性应用

深度学习在图像识别中的革命性应用标志着计算机视觉领域的重大进步。以下是深度学习在图像识别方面的一些革命性应用: 1. **卷积神经网络(CNN)的崭新时代**: - CNN是深度学习在图像识别中的核心技术,通过卷积层、池化…...

R语言读文件“-“变成“.“

R语言读取文件时发生"-"变成"." 如果使用read.table函数&#xff0c;需要 check.namesFALSE data <- read.table("data.tsv", headerTRUE, row.names1, check.namesFALSE)怎样将"."还原为"-" 方法一&#xff1a;gsub函…...

RabbitMQ 基础操作

概念 从计算机术语层面来说&#xff0c;RabbitMQ 模型更像是一种交换机模型。 Queue 队列 Queue&#xff1a;队列&#xff0c;是RabbitMQ 的内部对象&#xff0c;用于存储消息。 RabbitMQ 中消息只能存储在队列中&#xff0c;这一点和Kafka相反。Kafka将消息存储在topic&am…...

自然语言处理:Transformer与GPT

Transformer和GPT&#xff08;Generative Pre-trained Transformer&#xff09;是深度学习和自然语言处理&#xff08;NLP&#xff09;领域的两个重要概念&#xff0c;它们之间存在密切的关系但也有明显的不同。 1 基本概念 1.1 Transformer基本概念 Transformer是一种深度学…...

Ps:裁剪工具 - 裁剪预设的应用

裁剪工具提供了两种类型的裁剪方式。 一种是仅按宽高比&#xff08;比例&#xff09;进行裁剪&#xff0c;常在对图像进行二次构图时采用。 另一种则按指定的图像尺寸&#xff08;宽度值和高度值&#xff09;及分辨率&#xff08;宽 x 高 x 分辨率&#xff09;进行裁剪。其实质…...

前端工程化-什么是构建工具

了解构建工具之前&#xff0c;我们首先要知道的是浏览器只认识html、css、js&#xff0c;而我们开发时用的vue&#xff0c;react框架都只是为了方便我们开发而使用的工具 使用构建工具的原因 vue或react的企业级项目里都会具备这些功能&#xff1a; 1.使用typescript语言&…...

01-论文阅读-Deep learning for anomaly detection in log data: a survey

01-论文阅读-Deep learning for anomaly detection in log data: a survey 文章目录 01-论文阅读-Deep learning for anomaly detection in log data: a survey摘要I 介绍II 背景A 初步定义B 挑战 III 调查方法A 搜索策略B 审查的功能 IV 调查结果A 文献计量学B 深度学习技术C …...

图像处理02 matlab中NSCT的使用

06 matlab中NSCT的使用 最近在学习NSCT相关内容&#xff0c;奈何网上资源太少&#xff0c;简单看了些论文找了一些帖子才懂了一点点&#xff0c;在此分享给大家&#xff0c;希望有所帮助。 一.NSCT流程 首先我们先梳理一下NSCT变换的流程&#xff0c;只有清楚流程才更好的理清…...

三步搞定B站4K大会员视频下载:免费工具bilibili-downloader使用全攻略

三步搞定B站4K大会员视频下载&#xff1a;免费工具bilibili-downloader使用全攻略 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在…...

掌握中兴光猫高级管理:专业级Telnet权限获取实现指南

掌握中兴光猫高级管理&#xff1a;专业级Telnet权限获取实现指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫设备的高级网络管理权限获取一直是技术爱好者和网络管理员关注…...

如何高效处理大型JSON文件:专业工具使用完整指南

如何高效处理大型JSON文件&#xff1a;专业工具使用完整指南 【免费下载链接】HugeJsonViewer Viewer for JSON files that can be GBs large. 项目地址: https://gitcode.com/gh_mirrors/hu/HugeJsonViewer 在处理数据分析和开发工作中&#xff0c;JSON文件已经成为数据…...

QMCDecode:3分钟解锁QQ音乐加密文件,让音乐自由播放

QMCDecode&#xff1a;3分钟解锁QQ音乐加密文件&#xff0c;让音乐自由播放 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xf…...

终极STL体积计算指南:3步完成3D打印材料精确估算

终极STL体积计算指南&#xff1a;3步完成3D打印材料精确估算 【免费下载链接】STL-Volume-Model-Calculator STL Volume Model Calculator Python 项目地址: https://gitcode.com/gh_mirrors/st/STL-Volume-Model-Calculator STL-Volume-Model-Calculator是一款功能强大…...

抖音内容智能采集工具:轻松实现视频、图集与音乐的高效下载

抖音内容智能采集工具&#xff1a;轻松实现视频、图集与音乐的高效下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

告别连线噩梦:用SystemVerilog接口(interface)重构你的模块通信(附modport与时钟块实战)

告别连线噩梦&#xff1a;用SystemVerilog接口(interface)重构你的模块通信&#xff08;附modport与时钟块实战&#xff09; 在数字电路设计的进阶之路上&#xff0c;每个工程师都会遇到那个令人头疼的时刻——当模块间的信号连线从最初的几条膨胀到几十条&#xff0c;密密麻麻…...

GTNH中文汉化终极指南:3步解锁百万字专业翻译体验

GTNH中文汉化终极指南&#xff1a;3步解锁百万字专业翻译体验 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH 还在为GregTech: New Horizons&#xff08;GTNH&#xff09;整合包复杂的英文界…...

从零开始使用Taotoken在十分钟内完成第一个AI应用调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从零开始使用Taotoken在十分钟内完成第一个AI应用调用 1. 注册与初始准备 打开浏览器&#xff0c;访问Taotoken官方网站。注册流程…...

手把手教你用STM32驱动W25N01G NAND Flash(SPI模式配置与避坑指南)

手把手教你用STM32驱动W25N01G NAND Flash&#xff08;SPI模式配置与避坑指南&#xff09; 在嵌入式开发中&#xff0c;存储解决方案的选择往往决定了系统的可靠性和性能边界。W25N01G这颗1Gb容量的NAND Flash芯片&#xff0c;凭借其SPI接口的简洁性和适中的存储密度&#xff…...