发布作者: Charlotte
百度收录: 正在检测是否收录...
作品采用: 《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》许可协议授权
在开发 Web API 时,处理 JSON 数据的序列化和反序列化是非常常见的需求。Spring Boot 默认使用 Jackson 来进行 JSON 的处理,但有时候我们需要对 Jackson 的 ObjectMapper
进行自定义配置,以满足特定的业务需求。
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 处理的自定义。
接下来,我们详细解读两行关键代码,它们分别实现了忽略空字段和允许空对象序列化的功能。
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
这行代码的作用是控制 Jackson 是否允许序列化空对象。
SerializationFeature.FAIL_ON_EMPTY_BEANS
: 默认情况下,Jackson 在遇到没有任何字段的空对象时会抛出异常。例如,当你有一个类的所有字段值都为 null
或没有任何字段时,Jackson 会认为这个对象无法序列化,并抛出错误。false
: 通过将这个配置项设置为 false
,即使对象为空,Jackson 仍然会将其序列化为 {}
,而不会抛出异常。这对于一些复杂对象结构或需要返回空对象的场景非常有用。示例:
如果我们有一个类 User
,但所有字段都是空的,默认情况下序列化会失败,而通过这行配置后,可以安全地将其序列化为 {}
。
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
这行代码用于设置对象序列化时的字段包含规则,具体是忽略 null
值的字段。
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 响应的大小,同时提高数据的简洁性。
—— 评论区 ——