0


【Java】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格式化的配置相当多,大家有需要可以查询源码中的配置参数

importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.module.SimpleModule;importcom.fasterxml.jackson.databind.ser.std.ToStringSerializer;importcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule;importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;importcom.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;importcom.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;importcom.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.LocalTime;importjava.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
 */@ConfigurationpublicclassJacksonHandle{privatestaticfinalStringDEFAULT_DATE_TIME_PATTERN="yyyy-MM-dd HH:mm:ss";privatestaticfinalStringDEFAULT_DATE_PATTERN="yyyy-MM-dd";privatestaticfinalStringDEFAULT_TIME_PATTERN="HH:mm:ss";@Bean@PrimarypublicObjectMapperobjectMapper(){ObjectMapper objectMapper =newObjectMapper();//日期序列化器JavaTimeModule javaTimeModule =newJavaTimeModule();//日期序列化
        javaTimeModule.addSerializer(LocalDateTime.class,newLocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN)));
        javaTimeModule.addSerializer(LocalDate.class,newLocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)));
        javaTimeModule.addSerializer(LocalTime.class,newLocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)));//日期反序列化
        javaTimeModule.addDeserializer(LocalDateTime.class,newLocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_PATTERN)));
        javaTimeModule.addDeserializer(LocalDate.class,newLocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)));
        javaTimeModule.addDeserializer(LocalTime.class,newLocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)));//反序列化-禁用在遇到未知属性的时候抛出异常
        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);//注册序列化器
        objectMapper.registerModule(javaTimeModule);//自定义序列化器SimpleModulemodule=newSimpleModule();//添加将long序列化为stringmodule.addSerializer(Long.class,newToStringSerializer());//注册序列化器
        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"}
  1. FAIL_ON_EMPTY_BEANS(true) 含义:当序列化空的Java Bean时是否抛出异常。 默认值:false 示例:如果序列化一个没有字段的Java Bean,设置为 true 时会抛出异常。
  2. FAIL_ON_SELF_REFERENCES(true) 含义:当序列化时遇到循环引用(即对象引用自身)是否抛出异常。 默认值:false 示例:如果序列化一个包含自身引用的对象,设置为 true 时会抛出异常。
  3. WRAP_EXCEPTIONS(true) 含义:是否将所有异常包装为JsonMappingException。 默认值:false 示例:如果序列化过程中发生异常,默认情况下会直接抛出原始异常;如果设置为 true,则会包装为JsonMappingException。
  4. FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true) 含义:当反序列化时遇到未包装的类型标识符是否抛出异常。 默认值:false 示例:如果反序列化时遇到未包装的类型标识符,设置为 true 时会抛出异常。
  5. WRITE_SELF_REFERENCES_AS_NULL(false) 含义:当序列化循环引用时是否将循环引用的对象序列化为null。 默认值:false 示例:如果序列化一个包含自身引用的对象,设置为 true 时会将循环引用的部分序列化为 null。
  6. CLOSE_CLOSEABLE(false) 含义:序列化完成后是否关闭Closeable类型的对象。 默认值:false 示例:如果序列化过程中使用了Closeable对象,设置为 true 时会在序列化完成后关闭这些对象。
  7. FLUSH_AFTER_WRITE_VALUE(true) 含义:每次序列化后是否立即刷新输出流。 默认值:false 示例:如果设置为 true,每次序列化完成后都会立即刷新输出流。
  8. WRITE_DATES_AS_TIMESTAMPS(true) 含义:日期是否以时间戳形式序列化。 默认值:true 示例:如果设置为 false,日期将以字符串形式序列化。
  9. WRITE_DATE_KEYS_AS_TIMESTAMPS(false) 含义:日期键是否以时间戳形式序列化。 默认值:false 示例:如果设置为 true,日期键将以时间戳形式序列化。
  10. WRITE_DATES_WITH_ZONE_ID(false) 含义:日期是否包含时区信息。 默认值:false 示例:如果设置为 true,日期序列化时会包含时区信息。
  11. WRITE_DATES_WITH_CONTEXT_TIME_ZONE(true) 含义:日期是否使用上下文中的时区进行序列化。 默认值:true 示例:如果设置为 false,日期将使用UTC时区进行序列化。
  12. WRITE_DURATIONS_AS_TIMESTAMPS(true) 含义:持续时间是否以时间戳形式序列化。 默认值:true 示例:如果设置为 false,持续时间将以字符串形式序列化。
  13. WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false) 含义:字符数组是否以JSON数组的形式序列化。 默认值:false 示例:如果设置为 true,字符数组将以JSON数组的形式序列化。
  14. WRITE_ENUMS_USING_TO_STRING(false) 含义:枚举值是否使用其toString()方法的结果进行序列化。 默认值:false 示例:如果设置为 true,枚举值将以其toString()结果进行序列化。
  15. WRITE_ENUMS_USING_INDEX(false) 含义:枚举值是否使用其索引进行序列化。 默认值:false 示例:如果设置为 true,枚举值将以其索引进行序列化。
  16. WRITE_ENUM_KEYS_USING_INDEX(false) 含义:枚举键是否使用其索引进行序列化。 默认值:false 示例:如果设置为 true,枚举键将以其索引进行序列化。

DeserializationFeature配置参数

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

为了帮助更多像你一样的读者,我将持续在专栏中分享技术干货和实用技巧。如果你觉得这篇文章对你有帮助,可以考虑关注我的专栏,谢谢。

标签: java spring boot json

本文转载自: https://blog.csdn.net/weixin_43219644/article/details/141361987
版权归原作者 你住过的屋檐 所有, 如有侵权,请联系我们删除。

“【Java】Springboot通过ObjectMapper配置json序列化详解”的评论:

还没有评论