Springboot通过ObjectMapper配置json序列化详解

 更新时间:2024年10月21日 08:32:17   作者:你住过的屋檐  
SpringBoot默认集成Jackson库,其中ObjectMapper类是核心,用于Java对象与JSON字符串的互转,提供配置序列化特性、注册模块等方法,在SpringBoot中可以全局配置JSON格式,如日期格式化、将Long转为字符串,还可以配置序列化时的各种规则,感兴趣的可以了解一下

前言

Spring Boot 默认集成了 Jackson,ObjectMapper 是 Jackson 库中的一个核心类,它是用于将 Java 对象转换为 JSON 字符串,以及将 JSON 字符串转换回 Java 对象的主要工具。主要用于将数据格式化为指定格式,方便显示。

一、ObjectMapper主要提供了以下方法

1、configure(SerializationFeature f, boolean state);//用于配置序列化、反序列化、JsonParser特性、JsonGenerator 特性,
2、enable(T f,T…)//启用功能
3、disable(T f,T…)//禁用功能
4、 registerModule(Module module)//注册序列化器
5、readValue(String content, Class valueType) //将 JSON 字符串反序列化为指定类型的 Java 对象。
6、writeValueAsString(Object value) //将 Java 对象序列化为 JSON 字符串。
//以上的T可以是SerializationFeature 、DeserializationFeature 、JsonParser.Feature、JsonGenerator.Feature

二、在springboot中全局配置json格式化

通过创建配置类,注册一个ObjectMapper并且通过序列化器将日期转换为指定格式,将Long类型转换为字符串类型,同时以下配置也解决了接口接收未知数参数不抛出异常的问题,实际中大家可以复制下面代码并且增加增加自己所需要的配置,其实相关json格式化的配置相当多,大家有需要可以查询源码中的配置参数

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

/**
 * json处理
 * @aphorism You are lucky to have someone to help you.No one to help you, is just fate.No one should do anything for you, because life is your own, you are responsible for yourself
 */
@Configuration
public class JacksonHandle {
    private static final String DEFAULT_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
    private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";
    @Bean
    @Primary
    public ObjectMapper objectMapper(){
        ObjectMapper objectMapper = new ObjectMapper();
        //日期序列化器
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        //日期序列化
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN)));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)));
        //日期反序列化
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN)));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)));
        //反序列化-禁用在遇到未知属性的时候抛出异常
        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        //注册序列化器
        objectMapper.registerModule(javaTimeModule);
        //自定义序列化器
        SimpleModule module = new SimpleModule();
        //添加将long序列化为string
        module.addSerializer(Long.class, new ToStringSerializer());
        //注册序列化器
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

三、以下是我找到的一些具体配置的释义,大家有需要可以参考

SerializationFeature配置参数

以下是序列化配置类SerializationFeature中的配置项的具体含义:
1. WRAP_ROOT_VALUE(false)
含义:如果序列化的Java对象是一个单一值(例如一个基本类型或字符串),则将其包装在一个数组中。
默认值:false
示例:如果序列化一个字符串 “hello”,默认情况下输出 “hello”;如果设置为 true,则输出 [ “hello” ]。
2. INDENT_OUTPUT(false)
含义:是否对输出的JSON进行缩进格式化,以提高可读性。
默认值:false
示例:如果设置为 true,输出的JSON将会被格式化,例如 { “name”: “John” } 变为:

  {
    "name": "John"
  }
  • FAIL_ON_EMPTY_BEANS(true)
    含义:当序列化空的Java Bean时是否抛出异常。
    默认值:false
    示例:如果序列化一个没有字段的Java Bean,设置为 true 时会抛出异常。
  • FAIL_ON_SELF_REFERENCES(true)
    含义:当序列化时遇到循环引用(即对象引用自身)是否抛出异常。
    默认值:false
    示例:如果序列化一个包含自身引用的对象,设置为 true 时会抛出异常。
  • WRAP_EXCEPTIONS(true)
    含义:是否将所有异常包装为JsonMappingException。
    默认值:false
    示例:如果序列化过程中发生异常,默认情况下会直接抛出原始异常;如果设置为 true,则会包装为JsonMappingException。
  • FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true)
    含义:当反序列化时遇到未包装的类型标识符是否抛出异常。
    默认值:false
    示例:如果反序列化时遇到未包装的类型标识符,设置为 true 时会抛出异常。
  • WRITE_SELF_REFERENCES_AS_NULL(false)
    含义:当序列化循环引用时是否将循环引用的对象序列化为null。
    默认值:false
    示例:如果序列化一个包含自身引用的对象,设置为 true 时会将循环引用的部分序列化为 null。
  • CLOSE_CLOSEABLE(false)
    含义:序列化完成后是否关闭Closeable类型的对象。
    默认值:false
    示例:如果序列化过程中使用了Closeable对象,设置为 true 时会在序列化完成后关闭这些对象。
  • FLUSH_AFTER_WRITE_VALUE(true)
    含义:每次序列化后是否立即刷新输出流。
    默认值:false
    示例:如果设置为 true,每次序列化完成后都会立即刷新输出流。
  • WRITE_DATES_AS_TIMESTAMPS(true)
    含义:日期是否以时间戳形式序列化。
    默认值:true
    示例:如果设置为 false,日期将以字符串形式序列化。
  • WRITE_DATE_KEYS_AS_TIMESTAMPS(false)
    含义:日期键是否以时间戳形式序列化。
    默认值:false
    示例:如果设置为 true,日期键将以时间戳形式序列化。
  • WRITE_DATES_WITH_ZONE_ID(false)
    含义:日期是否包含时区信息。
    默认值:false
    示例:如果设置为 true,日期序列化时会包含时区信息。
  • WRITE_DATES_WITH_CONTEXT_TIME_ZONE(true)
    含义:日期是否使用上下文中的时区进行序列化。
    默认值:true
    示例:如果设置为 false,日期将使用UTC时区进行序列化。
  • WRITE_DURATIONS_AS_TIMESTAMPS(true)
    含义:持续时间是否以时间戳形式序列化。
    默认值:true
    示例:如果设置为 false,持续时间将以字符串形式序列化。
  • WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false)
    含义:字符数组是否以JSON数组的形式序列化。
    默认值:false
    示例:如果设置为 true,字符数组将以JSON数组的形式序列化。
  • WRITE_ENUMS_USING_TO_STRING(false)
    含义:枚举值是否使用其toString()方法的结果进行序列化。
    默认值:false
    示例:如果设置为 true,枚举值将以其toString()结果进行序列化。
  • WRITE_ENUMS_USING_INDEX(false)
    含义:枚举值是否使用其索引进行序列化。
    默认值:false
    示例:如果设置为 true,枚举值将以其索引进行序列化。
  • WRITE_ENUM_KEYS_USING_INDEX(false)
    含义:枚举键是否使用其索引进行序列化。
    默认值:false
    示例:如果设置为 true,枚举键将以其索引进行序列化。

DeserializationFeature配置参数

  • USE_BIG_DECIMAL_FOR_FLOATS
    用途:当序列化浮点数时,是否使用 BigDecimal 类型。
    默认值:false — 使用 double 类型。
  • USE_BIG_INTEGER_FOR_INTS
    用途:当序列化整数时,是否使用 BigInteger 类型。
    默认值:false — 使用 long 类型。
  • USE_LONG_FOR_INTS
    用途:当序列化整数时,是否使用 long 类型。
    默认值:false — 使用 int 类型。
  • USE_JAVA_ARRAY_FOR_JSON_ARRAY
    用途:当序列化 JSON 数组时,是否使用 Java 的数组类型。
    默认值:false — 使用 JsonArray 类型。
  • FAIL_ON_UNKNOWN_PROPERTIES
    用途:当遇到未知属性时是否抛出异常。
    默认值:true — 抛出异常。
  • FAIL_ON_NULL_FOR_PRIMITIVES
    用途:当遇到原始类型的 null 值时是否抛出异常。
    默认值:false — 不抛出异常。
  • FAIL_ON_NUMBERS_FOR_ENUMS
    用途:当遇到枚举类型的数字表示时是否抛出异常。
    默认值:false — 不抛出异常。
  • FAIL_ON_INVALID_SUBTYPE
    用途:当遇到无效子类型时是否抛出异常。
    默认值:true — 抛出异常。
  • FAIL_ON_READING_DUP_TREE_KEY
    用途:当读取重复的树键时是否抛出异常。
    默认值:false — 不抛出异常。
  • FAIL_ON_IGNORED_PROPERTIES
    用途:当遇到被忽略的属性时是否抛出异常。
    默认值:false — 不抛出异常。
  • FAIL_ON_UNRESOLVED_OBJECT_IDS
    用途:当遇到未解决的对象 ID 时是否抛出异常。
    默认值:true — 抛出异常。
  • FAIL_ON_MISSING_CREATOR_PROPERTIES
    用途:当缺少构造器属性时是否抛出异常。
    默认值:false — 不抛出异常。
  • FAIL_ON_NULL_CREATOR_PROPERTIES
    用途:当构造器属性为 null 时是否抛出异常。
    默认值:false — 不抛出异常。
  • FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY
    用途:当缺少外部类型 ID 属性时是否抛出异常。
    默认值:true — 抛出异常。
  • FAIL_ON_TRAILING_TOKENS
    用途:当遇到尾随标记时是否抛出异常。
    默认值:false — 不抛出异常。
  • WRAP_EXCEPTIONS
    用途:是否包装异常。
    默认值:true — 包装异常。
  • ACCEPT_SINGLE_VALUE_AS_ARRAY
    用途:是否接受单个值作为数组。
    默认值:false — 不接受。
  • UNWRAP_SINGLE_VALUE_ARRAYS
    用途:是否解包单值数组。
    默认值:false — 不解包。
  • UNWRAP_ROOT_VALUE
    用途:是否解包根值。
    默认值:false — 不解包。
  • ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
    用途:是否接受空字符串作为 null 对象。
    默认值:false — 不接受。
  • ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT
    用途:是否接受空数组作为 null 对象。
    默认值:false — 不接受。
  • ACCEPT_FLOAT_AS_INT
    用途:是否接受浮点数作为整数。
    默认值:true — 接受。
  • READ_ENUMS_USING_TO_STRING
    用途:是否使用 toString() 方法读取枚举。
    默认值:false — 不使用。
  • READ_UNKNOWN_ENUM_VALUES_AS_NULL
    用途:是否将未知枚举值读取为 null。
    默认值:false — 不读取为 null。
  • READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE
    用途:是否使用默认值读取未知枚举值。
    默认值:false — 不使用默认值。
  • READ_DATE_TIMESTAMPS_AS_NANOSECONDS
    用途:是否将日期时间戳读取为纳秒。
    默认值:true — 读取为纳秒。
  • ADJUST_DATES_TO_CONTEXT_TIME_ZONE
    用途:是否调整日期到上下文时区。
    默认值:true — 调整。
  • EAGER_DESERIALIZER_FETCH
    用途:是否急切地获取反序列化器。
    默认值:true — 急切获取。

到此这篇关于Springboot通过ObjectMapper配置json序列化详解的文章就介绍到这了,更多相关Springboot ObjectMapper配置json序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java根据开始时间和结束时间及周几计算日期的示例代码

    Java根据开始时间和结束时间及周几计算日期的示例代码

    在Java 7中,java.time包不存在,所以我们需要使用java.util.Calendar和java.util.Date类来实现类似的功能,这篇文章主要介绍了Java根据开始时间和结束时间及周几计算出日期的示例代码,需要的朋友可以参考下
    2024-06-06
  • java实现dijkstra最短路径寻路算法

    java实现dijkstra最短路径寻路算法

    这篇文章主要为大家详细介绍了java实现dijkstra最短路径寻路算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java中如何计算一段程序的运行时间

    Java中如何计算一段程序的运行时间

    这篇文章主要介绍了Java中如何计算一段程序的运行时间问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java中List转字符串的5种方法解析

    Java中List转字符串的5种方法解析

    在Java中将一个List转换为字符串有多种方法,下面这篇文章主要给大家介绍了关于Java中List转字符串的5种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Spring中缓存注解@Cache的使用详解

    Spring中缓存注解@Cache的使用详解

    这篇文章主要介绍了Spring中缓存注解@Cache的使用详解,使用注解对数据进行缓存功能的框架,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码,需要的朋友可以参考下
    2023-07-07
  • 详解JAVA SPI机制和使用方法

    详解JAVA SPI机制和使用方法

    这篇文章主要介绍了JAVA SPI机制的相关知识以及使用示例,文中代码非常详细,帮助大家更好的学习,感兴趣的朋友可以了解下
    2020-06-06
  • IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能

    IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能

    这篇文章主要介绍了IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • JavaTCP上传文本文件代码

    JavaTCP上传文本文件代码

    今天小编就为大家分享一篇关于JavaTCP上传文本文件代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • SpringBoot 异步线程间传递上下文方式

    SpringBoot 异步线程间传递上下文方式

    这篇文章主要介绍了SpringBoot 异步线程间传递上下文方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Springboot打包代码,反编译后代码混淆方式(防止还原代码)

    Springboot打包代码,反编译后代码混淆方式(防止还原代码)

    文章主要介绍了如何对Spring Boot项目进行jar包混淆,以防止反编译还原原始代码,通过在项目中添加proguard.cfg文件并配置Maven插件,可以实现代码混淆,从而增加反编译的难度
    2024-11-11

最新评论