Jackson 中使用 Optional

介绍

在本文中,我们会对 Optional 类进行一些说明,并且会解释下如果在使用 Optional 类的时候可能在 Jackson 中进行序列化和反序列化的过程中出现的问题。

针对上面的问题,本文会将会介绍在 Jackson 中如何处理 Optional 对象,和如果 Optional 对象可能出现潜在的 Null 的解决方案。

问题概览

首先让我们来看看如果使用 Jackson 来对 Optional 数据类型进行序列化和反序列化中出现的问题。

Maven 依赖

针对 Jackson,我们可以使用最新的版本。

当我们对本文进行更新的时候,jackson-core 的最新版本为 2.17.0。

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

定义 Book 对象

随后让我们来定义一个 Book 对象,在 Book 对象中,我们有一个使用 Optional 的字段。

当然在这个 Book 对象中,我们还需要添加 Getter 和 Setter 方法,在文章中,我们就省略到这些方法了。

public class Book {

    private String title;
    private Optional<String> subTitle;
}

在的对数据对象进行初始化的时候,我们需要注意对 Optional 对象设置值的方式,因为不同的值会影响序列化和反序列化的情况。

序列化

让我们先来实例化 Book 这个对象:

Book book = new Book();
book.setTitle("Oliver Twist");
book.setSubTitle(Optional.of("The Parish Boy's Progress"));

随后,我们使用 Jackson 的 ObjectMapper 方法来对实例化后的对象进行序列化,我们使用下面的代码来进行序列化:

String result = mapper.writeValueAsString(book);

从输出的字段中,我们可以看到输出的字符串内容中并没有输出具体的值,而是输出为下面的内容:

{"title":"Oliver Twist","subTitle":{"present":true}}

尽管上面的输出看起来有点奇怪,但是上面的输出却是正确的情况,因为这个和 Optional 的特性是有关的。

方法 isPresent() Optional 的 public getter 方法,这就意味着在序列化的时候基于我们对象中存储的具体的值,Jackson 将会输出 True 或者 False 。

这是 Jackson 当前正确的输出方式。

但,我们可能考虑在输出的时候输出具体的值,至于怎么输出这个具体的值的方法,我们在后续的解决方案中提出。

反序列化

现在,让我们使用上面的代码来对对象数据进行反序列化,考察使用下面的代码:

@Test(expected = JsonMappingException.class)
public void givenFieldWithValue_whenDeserializing_thenThrowException
    String bookJson = "{ \"title\": \"Oliver Twist\", \"subTitle\": \"foo\" }";
    Book result = mapper.readValue(bookJson, Book.class);
}

当上面的代码运行的时候将会提示下面的错误信息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.util.Optional` (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('foo')
 at [Source: (String)"{ "title": "Oliver Twist", "subTitle": "foo" }"; line: 1, column: 40] (through reference chain: com.ossez.jackson.optionalwithjackson.Book["subTitle"])

上面的错误信息针对 Jackson 来说是正确的,因为 Jackson 是需要一个构造方法来把 subtitle 参数的值来对 Optional 对象进行数据初始化。

解决方案

我们希望的是 Optional 对象应该把一个空的数据设置为 null,如果不是空的数据,Optional 应该使用值来进行处理。

针对上面的要求,Jackson 已经提供了解决方案,Jackson 针对 JDK8 的新增模块设置了一系列数据类型,这里就包括了 Optional。

Maven 依赖

首先,我们需要使用针对 JDK 8 使用的依赖,这个依赖的名称为:jackson-datatype-jdk8

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jdk8</artifactId>
   <version>2.17.0</version>
</dependency>

现在,我们需要把上面的依赖注册到 ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());

或者上面的 2 句话也可以简化成 1 句话:

 ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module());

序列化

现在,让我们来进行测试。

让我们再次使用上面的代码来对 Book 这个对象进行序列化和反序列化,然后我们在对输出的字符串进行查看。

Book book = new Book();
book.setTitle("Oliver Twist");
book.setSubTitle(Optional.of("The Parish Boy's Progress"));
String serializedBook = mapper.writeValueAsString(book);
 
assertThat(from(serializedBook).getString("subTitle"))
  .isEqualTo("The Parish Boy's Progress");

如果我们尝试序列化一个空的 Book 对象的话,那么 Optional 字段中存储的数据为 null。

book.setSubTitle(Optional.empty());
String serializedBook = mapper.writeValueAsString(book);
 
assertThat(from(serializedBook).getString("subTitle")).isNull();

##反序列化
现在我们来进行反序列化,当我们进行反序列化的时候,我们可以看到上面的代码不再抛出 JsonMappingException 异常。

Book newBook = mapper.readValue(result, Book.class);
 
assertThat(newBook.getSubTitle()).isEqualTo(Optional.of("The Parish Boy's Progress"));

最后,我们再对上面的测试代码进行测试,从上面的代码代码输出中我们也可以看到没有异常,同时我们还得到了一个空的 Optional 对象。

assertThat(newBook.getSubTitle()).isEqualTo(Optional.empty());

结论

本文对针对 JDK 8 的新特性中提供的一些数据模型进行一些说明。

Jackson 需要注册一个新的 jdk8 数据类型才能对数据进行处理。

因为 Optional 是 JDK 8 中提供的新的数据特性,因此我们对一些新的数据类型我们需要有一些了解。

同时,针对 Jackson 还是有必要保持 JDK 的版本一致性和尽量使用比较高的版本,这样就可以使用更多有关 Jackson 提供的功能。

Jackson 中使用 Optional - Java - iSharkFly介绍在本文中,我们会对 Optional 类进行一些说明,并且会解释下如果在使用 Optional 类的时候可能在 Jackson 中进行序列化和反序列化的过程中出现的问题。 针对上面的问题,本文会将会介绍在 Jackson 中如何处理 Optional 对象,和如果 Optional 对象可能出现潜在的 Null 的解决方案。 问题概览首先让我们来看看如果使用 Jackson 来对 Optional 数据类型进行序列化和反序列…icon-default.png?t=N7T8https://www.isharkfly.com/t/jackson-optional/15713/1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2项目升级到vue3经历分享3

当初花了1个半月将十几个微服务从mybatis升级为mybatis-plus&#xff0c;就很自信的认为前端vue2升级到vue3也不过so so&#xff0c;世界过程中却是折腾&#xff0c;写法乱七八糟&#xff0c;不兼容的问题一大堆。 1 操作dom元素 this.$refs.subject[index].$children[0].$chil…

「 网络安全常用术语解读 」通用配置枚举CCE详解

1. 背景介绍 NIST提供了安全内容自动化协议&#xff08;Security Content Automation Protocol&#xff0c;SCAP&#xff09;为漏洞描述和评估提供一种通用语言。SCAP组件包括&#xff1a; 通用漏洞披露(Common Vulnerabilities and Exposures, CVE)&#xff1a;提供一个描述…

wordpress子比主题给文章内容加上密码查看

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤1.引入库2.读入数据第三步:文章内添加代码前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,…

乳制品粘性测试:操作流程详解

乳制品粘性测试&#xff1a;操作流程详解 在乳制品生产中&#xff0c;粘性测试是确保产品质量和口感的重要步骤。通过详细的操作流程&#xff0c;我们可以准确评估乳制品的粘性&#xff0c;为产品优化和品质控制提供有力支持。本文将详细介绍乳制品粘性测试的操作流程。 一、准…

应用层协议——http协议和https协议

目录 一、HTTP协议 1、概念 2、URL 二、HTTP协议格式 1、请求协议格式 2、响应协议格式 三、HTTP的请求方法 四、HTTP的状态码 五、HTTP常见的报头 六、HTTP和HTTPS 1、HTTPS协议 2、HTTPS的加密原理 1、基本概念 2、加密原理 通常我们程序员在网络编程的时候&am…

CSDN如何转载他人文章(超简单)

经常遇到一篇很好的文章&#xff0c;但是CSDN没有转载功能&#xff0c;所以需要我们自己处理一下。以谷歌浏览器打开某篇文章为例 一、按F12打开开发者工具 二、复制转载文章内容 按Ctrlf查找content_views&#xff0c;找到这一行<div id"content_views" class&…

2024项目拆解日均引流100+精准创业粉,全程干货

详情介绍 2024年项目拆解引流高质量创业粉&#xff0c;全程干货单日轻松引流100&#xff0c;项目拆解类视频本身引流效果就非常不错&#xff0c;视频内容针对性强直击创业粉内心&#xff0c;获客非常有效。做好视频钩子&#xff0c;和后端承接&#xff0c;赚钱没那么难。 课程…

没有精益管理内容的数字化,会是成功的数字化吗?

精益管理与数字化的结合被认为是制造业和企业管理中的一种重要转型策略。精益管理注重消除浪费、提升效率和质量&#xff0c;而数字化则通过技术手段来实现这一目标&#xff0c;两者的结合能够带来更高效、更智能的生产和管理方式。 首先&#xff0c;精益管理的核心理念是价值…

什么是HTTPS证书?怎么免费申请?——值得收藏

SSL证书的核心功能在于保障互联网数据传输的安全性和网站身份的可靠性。它通过加密通信防止信息被窃取或篡改&#xff0c;同时验证网站的真实身份&#xff0c;有效抵御钓鱼攻击&#xff0c;增强用户信任。此外&#xff0c;使用SSL证书还有助于提升网站在搜索引擎中的排名&#…

Docker 入门篇(六)-- idea 打包 docker 镜像流程

环境准备&#xff1a; idea 环境&#xff1a;IntelliJ IDEA 2021.3.1 (Ultimate Edition)docker 版本&#xff1a;v. 26.1.0准备 springboot jar 文件 &#xff1a;target/DockerDemo-0.0.1-SNAPSHOT.jardocker 可视化管理工具 portainer &#xff1a;v2.6.0 一. 配置docker远…

前端面试题大合集3----网络篇

一、Http协议详解&#xff0c;http请求方式&#xff0c;http状态码 Http协议详解&#xff1a; 全称Hyper Text Transfer Protocol&#xff0c;即超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络传输协议。 是一个无状态的应用层协议&#xff0c;即不会保存客户…

【管理咨询宝藏92】国际咨询公司为大型药企数字化转型项目规划方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏92】国际咨询公司为大型药企数字化转型项目规划方案 【格式】PDF版本 【关键词】国际咨询公司、药企转型、数字化转型 【核心观点】 - 企业业务…

51-48 CVPR 2024 | Vlogger: make your dream a vlog 自编剧制作视频博客

24年1月&#xff0c;上海交大、上海人工智能实验室、中科院联合发布Vlogger&#xff1a;make your dream a vlog。该论文主要工作是生成超过5分钟的视频博客vlog。鉴于现有文本到视频T2V生成方法很难处理复杂的故事情节和多样化的场景&#xff0c;本文提出了一个名为Vlogger的通…

百度文库最新AI旋转验证码

上个月发现百度文库最新出了一个验证码&#xff0c;是AI生成的。内容每次可能都不一样&#xff0c;所以给识别造成 了很大困难。传统的比对放松完全失效。 一、介绍 这个是最近才出的最新验证码&#xff0c;内容主要以工厂、建筑、山峰、机器人、汽车、盆栽植物等为主。如下图…

Elasticsearch:如何使用 Java 对索引进行 ES|QL 的查询

在我之前的文章 “Elasticsearch&#xff1a;对 Java 对象的 ES|QL 查询”&#xff0c;我详细介绍了如何使用 Java 来对 ES|QL 进行查询。对于不是很熟悉 Elasticsearch 的开发者来说&#xff0c;那篇文章里的例子还是不能单独来进行运行。在今天的这篇文章中&#xff0c;我来详…

【DPU系列之】Bluefield 2 DPU卡的功能图,ConnectX网卡、ARM OS、Host OS的关系?(通过PCIe Switch连接)

核心要点&#xff1a; CX系列网卡与ARM中间有一个PCIe Swtich的硬件单元链接。 简要记录。 可以看到图中两个灰色框&#xff0c;上端是Host主机&#xff0c;下端是BlueField DPU卡。图中是BF2的图&#xff0c;是BF2用的是DDR4。DPU上的Connect系列网卡以及ARM系统之间有一个…

第一课为SimaPro的基本特征

问题&#xff1a; 咖啡机的设计中的环境影响指标。 step 1 点击Wizards&#xff0c;看到“Guided tour (with coffee)”。 在这个例子里&#xff0c; 定义了两种咖啡机&#xff1a; Sima型咖啡机 和 Pro型咖啡机&#xff0c; 具有以下规格&#xff1a; Sima型咖啡机 Pro型咖啡…

MySQL——Windows平台下MySQL安装与配置(一)MySQL安装

Windows平台下安装和配置 基于Windows平台的MySQL安装文件有两个版本&#xff0c;一种是以.msi作为后缀名的二进制分发版&#xff0c;一种是以.zip作为后缀的压缩文件。其中.msi的安装文件提供了图形化的安装向导&#xff0c;按照向导提示进行操作即可安装完成&#xff0c;.zip…

7-92 骨牌铺方格

在2n的一个长方形方格中&#xff0c;用一个12的骨牌铺满方格&#xff0c;输入n&#xff0c;输出铺放方案的总数。例如n3时&#xff0c;骨牌的铺放方案有3种&#xff0c;如下图所示。 输入格式: 测试数据有多组&#xff0c;处理到文件尾。每组测试输入一个整数n&#xff08;0&l…