杰克逊顶部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程

1.介绍

在本文中,我们将概述概述可选的类,然后解释使用jackson时可能遇到的一些问题。

在此之后,我们将介绍一个可以让杰克逊治疗的解决方案术语好像它们是普通的可归类物体。

2.问题概述

首先,让我们来看看当我们尝试序列化和反序列化时会发生什么术语与杰克逊。

2.1。maven依赖

要使用杰克逊,让我们确保我们正在使用最新版本

<依赖项>  com.fasterxml.jackson.core   Jackson-Core   2.11.1  

2.2。我们的书对象

然后,让我们创建一个课程书,包含一个普通和一个可选的场地:

公共类书{字符串标题;可选字幕;// getters和setter obited}

想到这一点术语不应该用作字段,我们正在这样做,以说明问题。

2.3。序列化

现在,让我们实例化一个

书籍=新书();Book.settitle(“奥利弗扭曲”);Book.setsubtitle(可选.Of(“教区男孩的进展”));

最后,让我们尝试使用杰克逊序列化它ObjectMapper.

String结果= Mapper.WriteValueAstring(书);

我们会看到输出的可选的字段,不包含其值,而是包含一个名为字段的嵌套JSON对象展示

{“标题”:“oliver twist”,“subtitle”:{现在“:true}}

虽然这可能看起来很奇怪,但它实际上是我们应该期待的。

在这种情况下,存在()是一个公共吸气工可选的班级。这意味着它将以值序列化真的或者错误的,取决于它是空的还是不是空的。这是杰克逊的默认序列化行为。

如果我们考虑它,我们想要金宝搏官网188be的是实际的价值字幕要序列化的字段。

2.4。反序列化

现在,让我们来撤消我们上一个例子,这次尝试将一个对象反驳到一个可选的。我们会看到现在我们得到一个jsonmappingexception.

@test(预期= jsonmappingexception.class)public void giventfieldwithvalue_whendeserializing_thenthrowexception字符串书架=“{\”标题\“:\”oliver twist \“,\”subtitle \“:\”foo \“}”;Book Result = Mapper.ReadValue(书籍,书籍.Class);}

让我们查看堆栈跟踪:

com.fasterxml.jackson.databind.jsonmappingException:无法构造java.util.optional的实例:没有字符串参数构造函数/工厂方法从字符串值('Parish Boy的进度')进行反序列化

这种行为再次有意义。基本上,杰克逊需要一个可以占据价值的构造函数字幕作为一个论点。我们的情况并非如此可选的场地。

3.解决方案

我们想要的,是杰克逊对待空可选的作为空值,并治疗礼物可选的作为代表其价值的领域。

幸运的是,这个问题已经为我们解决了。杰克逊拥有一组处理JDK 8数据类型的模块, 包括可选的

3.1。Maven依赖和注册

首先,让我们将最新版本添加为Maven依赖项:

  com.fasterxml.jackson.datatype   jackson-dataType-jdk8   2.9.6  

现在,我们需要做的就是使用我们的模块ObjectMapper.

objectMapper映射器= new objectMapper();mapper.registerermodule(新的JDK8Module());

3.2。序列化

现在,让我们来测试它。如果我们尝试序列化我们的再次对象,我们会看到现在有一​​个字幕,与嵌套的JSON相反:

书籍=新书();Book.settitle(“奥利弗扭曲”);Book.setsubtitle(可选.Of(“教区男孩的进展”));String serializedBook = Mapper.WriteValueAstring(书);assertthat(来自(Serializedbook).getstring(“字幕”)).isequalto(“教区男孩的进展”);

如果我们尝试序列化空白,它将被存储为空值

Book.setsubtitle(可选..pmet());String serializedBook = Mapper.WriteValueAstring(书);assertthat(来自(serializedbook).getstring(“subtitle”))。isnull();

3.3。反序列化

现在,让我们重复我们的反序列化测试。如果我们重读了我们的书,我们会看到我们不再得到一个jsonmapppedException:

Book Newbook = Mapper.ReadValue(结果,书籍.Class);assertthat(newbook.getsubtitle())。isequalto(可选。(“教区男孩的进展”));

最后,让我们再次重复测试,这次空值。我们再次看到我们没有得到一个jsonmappingexception,事实上,有一个空的可选的:

assertthat(newbook.getsubtitle())。isequalto(可选..或());

4。结论

我们通过利用JDK 8数据类型模块来展示如何解决这个问题,演示如何使杰克逊能够对待空可选的作为空值,和一个现在可选的作为一个普通的领域。

可以找到这些示例的实现在github上;这是基于Maven的项目,所以应该易于运行。

杰克逊底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>查看课程
评论在本文上关闭!