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

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"
  }
  
  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中的JSON序列化和反序列化是将Java对象转换为JSON格式的字符串,或将JSON格式的字符串转换为Java对象的过程。 在Java中,可以使用各种库来进行JSON序列化和反序列化,比较常用的有以下几种: 1. Jackson:Jackson是一个功能强大且广泛使用的JSON处理库,它提供了一系列的API来实现JSONJava对象之间的转换。通过Jackson,可以将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。 2. Gson:Gson是Google提供的一个简单易用的JSON处理库,它可以将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。Gson提供了一些简单的API来实现序列化和反序列化操作。 3. Fastjson:Fastjson是阿里巴巴开源的一个高性能的JSON处理库,它支持将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。Fastjson提供了一些灵活的API来实现序列化和反序列化操作。 这些库都提供了类似的API,可以根据具体需求选择适合的库进行使用。一般来说,使用这些库进行JSON序列化和反序列化的步骤如下: 1. 创建一个Java对象,并设置相应的属性值。 2. 使用JSON处理库的API将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。 下面是一个使用Jackson库进行JSON序列化和反序列化的示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonSerializationExample { public static void main(String[] args) throws Exception { // 创建一个Java对象 Person person = new Person("John", 25); // 创建ObjectMapper对象 ObjectMapper objectMapper = new ObjectMapper(); // 将Java对象转换为JSON字符串 String jsonString = objectMapper.writeValueAsString(person); System.out.println("JSON String: " + jsonString); // 将JSON字符串转换为Java对象 Person deserializedPerson = objectMapper.readValue(jsonString, Person.class); System.out.println("Deserialized Person: " + deserializedPerson); } } class Person { private String name; private int age; public Person() {} public Person(String name, int age) { this.name = name; this.age = age; } // 省略getter和setter方法 @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } } ``` 这个示例中,首先创建了一个Person对象,然后使用ObjectMapper将Person对象转换为JSON字符串,并输出结果。接着,将JSON字符串转换为Java对象,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值