【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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】--python基础学习

目录 一、基础语法二、基础数据类型1、变量赋值2、数值型3、字符串型4、列表List5、元组Tuple6、字典dictionary7、数据类型转换 三、python运算符四、条件控制与循环五、常用函数1、字符串函数2、format函数 一、基础语法 标识符是允许作为变量(函数、类等&#x…

【C++】模板初阶 【 深入浅出理解 模板 】

模板初阶 前言:泛型编程一、函数模板(一)函数模板概念(二)函数模板格式(三)函数模板的原理(四)函数模板的实例化(五)模板参数的匹配原则 三、类模…

从大模型到内容生成,初窥门径的AI新次元

视频云AI进化新纪元。 最近Gartner发布2024年十大战略技术趋势,AI显然成为其背后共同的主题。全民化的生成式人工智能、AI增强开发、智能应用......我们正在进入一个AI新纪元。 从ChatGPT的横空出世,到开发者大会的惊艳亮相,OpenAI以一己之力…

logic-flow 使用过程中遇到的bug - 拖动节点到画布的时候,鼠标松开,节点不落在画布,仍旧跟着鼠标走

背景: 插件:logicFlow 用途:画流程图 bug表现: 初始化的样子: bug的样子: 拖动第一个节点的时候,一切正常(无论哪个节点作为第一个节点,都是正常的,但是拖动…

2014年2月24日 Go生态洞察:FOSDEM 2014上的Go演讲精选

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

芯片IO口不加电阻会怎样?

芯片IO口不加电阻会怎样? 可能会导致以下几个后果: 1.高电流问题,IO口没有电阻限流,当与外部设备直接连接时,就可能会导致过大的电流流过IO口,这就可能损坏IO口,引起短路或烧坏其它电路组件。像…

创新无界:通义灵码在测试过程中展现的独特魅力

通义灵码基于通义大模型,提供代码智能生成、研发智能问答能力。本文就来介绍下通义灵码在测试过程中的应用。 操作手册: 通义灵码, 阿里云提供的一款基于通义大模型的智能编码辅助工具_云效-阿里云帮助中心 1. 什么是通义灵码 是阿里云出品的一款基于通…

自己动手打包构建编译cri-dockerd

1.背景 本机是 armv7l架构cpu,发现官方文档中竟然没有,因此需要自己编译下; [rootcontainer0 ~]# uname -a Linux container0 5.4.206-v7l.1.el7 #1 SMP Mon Jul 25 14:13:29 UTC 2022 armv7l armv7l armv7l GNU/Linux2.打包/构建/编译 gi…

RabbitMQ消息队列快速入门

RabbitMQ消息队列快速入门 初始MQ MQ全称为Message Queue,即消息队列,是在消息的传输过程中保存消息的容器。它是典型的生产者-消费者模型。 生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。消息的生产和消费都是异步的&am…

Java实现围棋算法

围棋是一种源自中国的棋类游戏,也是世界上最古老、最复杂的棋类游戏之一。该游戏由黑白两方交替放置棋子在棋盘上进行,目的是将自己的棋子占据更多的空间,并将对手的棋子围死或吃掉,最终获得胜利。围棋不仅是一种游戏,…

【Node.js】大前端技能最通俗易懂的讲解 快速入门必看

目录 1、概述前端工具VSCode安装 2、NodeJS的安装 3、NodeJS了解和快速入门 4、NodeJS实现HttpServer服务 5、NodeJS实现操作MySQL数据库 Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端执行Node.js是一个基于Chrome V8引擎的Ja…

01-了解微服务架构的演变过程和微服务技术栈

微服务 微服务架构演变 单体架构:将业务的所有功能集中在一个项目中开发最后打成一个包部署 优点: 架构简单, 部署成本低,适合小型项目缺点: 耦合度高, 升级维护困难 分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发称为一个服务 优点: 降低服务耦合…

金融企业为啥不选择云服务器还是考虑服务器托管

尽管云主机在近年来的发展中取得了巨大的成功,但在金融行业中,一些客户仍然倾向于将服务器托管到数据中心,而不是使用云主机。以下是一些金融客户选择将服务器托管到数据中心的原因: 数据安全性:金融行业对数据的安全性…

Arduino驱动Si7021温湿度传感器(温湿度传感器)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Si7021温湿度传感器,应用了专用的数字模块采集技术和温湿度传感技术,具有极高的可靠性与卓越的长期稳定性。同时其体积小巧、精度高,特别是拥有毫秒级测试转换时间(DHT系列需要约2s的转换时间),启动测量与读…

抖音预约服务小程序开发:前端与后端技术的完美融合

开发抖音预约服务小程序成为了一种有趣而又实用的尝试。本篇文章,小编会与大家共同探讨抖音预约服务小程序开发的前端与后端技术融合的关键要点。 一、前端技术选择与设计 1.小程序框架 开发抖音预约服务小程序的前端,首先需要选择一个适用的小程序框…

Ubuntu设设置默认外放和麦克风设备

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pulseaudio 是什么?二、配置外放1.查看所有的外放设备2.设定默认的外放设备3.设定外放设备的声音强度4.设定外放设备静音 三、配置麦克风1.查看…

C#winform门诊医生系统+sqlserver

C#winform门诊医生系统sqlserver说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术:基于C#winform架构和sql server数据库 功能模块: 个人中心:修改个人信息、打开照片并进行修改 预约挂号:二级…

轻松驾驭Linux命令:账户查看、目录文件操作详解

🎥 屿小夏 : 个人主页 🔥个人专栏 : Linux系统操作 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑引言🌤️查看账户☁️whoami☁️who 🌤️ls和目录文件的创建删除☁…

【Spring Boot】如何运用Spring Cache并设置缓存失效时间

简单描述 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheMan…