侧边栏壁纸

Spring Boot 中定制 ObjectMapper 的全局 JSON 序列化配置

2024年10月13日 178阅读 0评论 1点赞

在开发 Web API 时,处理 JSON 数据的序列化和反序列化是非常常见的需求。Spring Boot 默认使用 Jackson 来进行 JSON 的处理,但有时候我们需要对 Jackson 的 ObjectMapper 进行自定义配置,以满足特定的业务需求。

1. 全局配置 ObjectMapper

在 Spring Boot 中,我们可以通过自定义 HttpMessageConverter 来实现全局的 JSON 序列化配置。具体实现如下:

package com.jingdianjichi.subject.application.config;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport {

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        converters.add(mappingJackson2HttpMessageConverter());
    }

    private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        ObjectMapper objectMapper = new ObjectMapper();
        
        // 1. 允许空对象序列化
        objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        
        // 2. 忽略空值字段
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        
        return new MappingJackson2HttpMessageConverter(objectMapper);
    }
}

在这个类中,我们继承了 WebMvcConfigurationSupport 并覆盖了 configureMessageConverters 方法,通过添加自定义的 MappingJackson2HttpMessageConverter 实现了对全局 JSON 处理的自定义。

2. 配置详解

接下来,我们详细解读两行关键代码,它们分别实现了忽略空字段和允许空对象序列化的功能。

2.1 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

这行代码的作用是控制 Jackson 是否允许序列化空对象。

  • SerializationFeature.FAIL_ON_EMPTY_BEANS: 默认情况下,Jackson 在遇到没有任何字段的空对象时会抛出异常。例如,当你有一个类的所有字段值都为 null 或没有任何字段时,Jackson 会认为这个对象无法序列化,并抛出错误。
  • false: 通过将这个配置项设置为 false,即使对象为空,Jackson 仍然会将其序列化为 {},而不会抛出异常。这对于一些复杂对象结构或需要返回空对象的场景非常有用。

示例:
如果我们有一个类 User,但所有字段都是空的,默认情况下序列化会失败,而通过这行配置后,可以安全地将其序列化为 {}

2.2 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

这行代码用于设置对象序列化时的字段包含规则,具体是忽略 null 值的字段。
m27eu4pd.png
m27f4beb.png

  • JsonInclude.Include.NON_NULL: 该配置告诉 Jackson 在序列化时,忽略所有值为 null 的字段。也就是说,如果对象的某个字段值为 null,那么这个字段不会出现在最终的 JSON 结果中。

示例:
假设我们有如下 Java 对象:

User user = new User();
user.setName(null);
user.setAge(25);

通过配置 NON_NULL,序列化后的 JSON 将会是:

{
  "age": 25
}

而不会包含 null 值的 name 字段。这样可以减少 API 响应的大小,同时提高数据的简洁性。

1
打赏

—— 评论区 ——

昵称
邮箱
网址
取消
人生倒计时
舔狗日记