杰克逊顶部

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

>>查看课程

1.概述

使用JSON格式时,Spring Boot将使用ObjectMapper.实例序列化响应和反序列化请求。在本教程中,我们将查看最常用的方法来配置序列化和反序列化选项。

要了解有关杰克逊的更多信息,金宝搏官网188be请务必查看我们的杰克逊教程

2.默认配置

默认情况下,Spring启动配置将:

  • 禁用mapperfeature.default_view_inclusion
  • 禁用DeserializationFeature。FAIL_ON_UNKNOWN_PROPERTIES
  • 禁用serializationfeature.write_dates_as_timestamps.

让我们从一个快速的例子开始:

  • 客户端将发送一个GET请求到/咖啡?名称= Lavazza
  • 控制器将返回一个new咖啡目的
  • 春天将使用ObjectMapper.将我们的pojo序列化为json

我们将通过使用举例说明自定义选项细绳localDateTime.对象:

public class Coffee {private String name;私人字符串品牌;私人LocalDateTime日期;//获取和设置

我们还将定义一个简单的休息控制器来展示序列化

@RequestParam(required = false) String name) {return new coffee () .setBrand(brand) .setDate(FIXED_DATE) .setName(name);}

默认情况下,调用GET时的响应http:// lolcahost:8080 /咖啡?品牌= Lavazza将会是:

{“姓名”:null,“品牌”:“Lavazza”,“日期”:“2020-11-16T10:21:35.974”}

我们想排除值并具有自定义日期格式(DD-MM-YYYY HH:MM)。最终的反应将是:

{“品牌”:“札”,“日期”:“04-11-2020 34 "}

使用Spring Boot时,我们可以选择自定义默认值ObjectMapper.或覆盖它。我们将在下一节中介绍这些选项。

3.自定义默认值ObjectMapper.

在本节中,我们将看到如何自定义默认值ObjectMapper.Spring Boot使用的。

3.1。应用程序属性和自定义Jackson模块

配置映射器的最简单方法是通过应用程序属性。配置的一般结构是:

spring.jackson。 = true,false

作为一个例子,如果我们想禁用serializationfeature.write_dates_as_timestamps.,我们将添加:

spring.jackson.serialization.write-dates-stimestamps = false

除了上面提到的特性类别外,我们还可以配置属性包含:

spring.jackson.default-property-包含= always,non_null,non_absent,non_default,non_empty

配置环境变量是最简单的方法。这种方法的缺点是我们无法自定义具有自定义日期格式的高级选项localDateTime.。在这一点上,我们将得到结果:

{“品牌”:“Lavazza”,“日期”:“2020-11-16T10:35:34.593”}

为了实现我们的目标,我们将注册一个新的javatimemodule.使用我们的自定义日期格式:

@Configuration @PropertySource(“classpath:coffee.properties”)public class CoffeeRegisterModuleConfig {@Bean公共模块javaTimeModule() {javaTimeModule模块= new javaTimeModule();module.addSerializer (LOCAL_DATETIME_SERIALIZER);返回模块;}}

同样,配置属性文件咖啡.properties.将包含:

spring.jackson.default-property-inclusion = non_null

Spring Boot将自动注册任何类型的beancom.fasterxml.jackson.databind.Module。最终结果将是:

{“品牌”:“Lavazza”,“日期”:“16-11-2020 10:43”}

3.2。Jackson2ObjectMapperBuilderCustomizer.

此功能界面的目的是允许我们创建配置bean。它们将应用于默认值ObjectMapper.通过Jackson2ObjectMapperBuilder

@Bean public jackson2objectmappperbuildercustomizer jsonCustomizer(){返回builder -> builder. serializationinclusion (JsonInclude.Include.NON_NULL) .serializers(LOCAL_DATETIME_SERIALIZER);}

配置bean以特定顺序应用,我们可以使用它来使用@命令注解。如果我们想要配置ObjectMapper.来自不同的配置或模块。

4.覆盖默认配置

如果我们想完全控制配置,有几个选项将禁用自动配置,只允许应用自定义配置。让我们仔细看看这些选项。

4.1。ObjectMapper.

覆盖默认配置的最简单方法是定义一个ObjectMapper.豆并将其标记为@Primary

@Bean @Primary public ObjectMapper ObjectMapper () {JavaTimeModule模块= new JavaTimeModule();module.addSerializer (LOCAL_DATETIME_SERIALIZER);返回新的ObjectMapper() .setSerializationInclusion(JsonInclude.Include.NON_NULL) .registerModule(module);}

当我们想要完全控制序列化过程并且不想允许外部配置时,我们应该使用这种方法

4.2。Jackson2ObjectMapperBuilder

另一种干净的方法是定义一个Jackson2ObjectMapperBuilder实际上,Spring Boot在构建ObjectMapper.并会自动捡起一个定义:

@bean public jackson2objectmapperbuilder jackson2objectmapperbuilder(return new jackson2objectmapperbuilder()。serializers(local_datetime_serializer).serializationinclusion(jsoninclude.include.non_null);}

默认情况下,它会配置两个选项:

  • 禁用mapperfeature.default_view_inclusion
  • 禁用DeserializationFeature。FAIL_ON_UNKNOWN_PROPERTIES

根据Jackson2ObjectMapperBuilder文件,如果它们存在于类路径上,它还将注册一些模块:

  • Jackson-DataType-JDK8:支持其他Java 8类型可选的
  • Jackson-DataType-JSR310:支持Java 8日期和时间API类型
  • Jackson-DataType-Joda:支持Joda-Time类型
  • 杰克逊模块-Kotlin:支持Kotlin类和数据类

这种方法的优点是Jackson2ObjectMapperBuilder提供一种简单直观的方式来构建一个ObjectMapper.

4.3。MappingJackson2HttpMessageConverter

我们可以使用类型定义beanMappingJackson2HttpMessageConverter,春靴将自动使用它:

@Bean公共MappingJackson2HttpMessageConverter MappingJackson2HttpMessageConverter () {Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().serializers(LOCAL_DATETIME_SERIALIZER) .serializationInclusion(JsonInclude.Include.NON_NULL);返回新MappingJackson2HttpMessageConverter (builder.build ());}

一定要查看我们的春天http消息转换器文章了解更多。

5.测试配置

为了测试我们的配置,我们将使用TestRestTemplate并序列化物体细绳。通过这种方式,我们可以验证我们的咖啡对象序列化而没有值,并使用自定义日期格式:

@Test public void whenGetCoffee_thenSerializedWithDateAndNonNull() {String formattedDate = DateTimeFormatter.ofPattern(CoffeeConstants.dateTimeFormat).format(FIXED_DATE);字符串品牌= "Lavazza";String url = "/coffee? "品牌= " +品牌;String response = restTemplate。getForObject (url, String.class);为了(响应)。isEqualTo(“{\“品牌\”:\ " +品牌+“\”,\“\”:\ " + formattedDate  + "\"}");}

6.结论

在本教程中,我们介绍了在使用Spring Boot时配置JSON序列化选项的几种方法。

我们看到了两种不同的方法:配置默认选项或覆盖默认配置。

一如既往,可以使用文章的完整源代码在github上

杰克逊底部

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

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