Springboot通过ObjectMapper配置json序列化详解
作者:你住过的屋檐
前言
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序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!