springboot响应返回json字段值为null根据字段类型统一处理,Boolean类型转成NUMBER

本文介绍如何在Jackson配置中,针对不同类型设置默认值处理策略,包括数组、Spring、整数等,并通过自定义Serializer实现null值转换。还演示了如何在SpringBoot中应用这些策略和配置一个JacksonConfig实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司突然添加了后端响应规范,禁止值为null,所有需要统一赋默认值。像下图这种就需要根据不同类型来返回不同默认值。

首先创建一个Modifier

public class MyBeanSerializerModifier extends BeanSerializerModifier {

//对值进行处理的JsonSerializer 后面会对此值进行实现赋值
    private JsonSerializer<Object> _nullJsonSerializer = null;

    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        // 循环所有的beanPropertyWriter
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = beanProperties.get(i);
            // 判断字段的类型,如果是array,spring,integer则注册nullSerializer
            //给writer注册一个自己的nullSerializer
            writer.assignNullSerializer(this.defaultNullArrayJsonSerializer(writer.getPropertyType()));
        }
        return beanProperties;
    }

}

其中包含方法,判断是什么类型,进行不同类型的格式赋值。

// 判断是什么类型
protected JsonSerializer<Object> defaultNullArrayJsonSerializer(Class<?> clazz) {
    _nullJsonSerializer = new SpringJsonSerializer();
    if (clazz.isArray() || clazz.equals(List.class) || clazz.equals(Set.class)) {
        _nullJsonSerializer = new ArrayJsonSerializer();
    }
    if (clazz.equals(Date.class)) {
        _nullJsonSerializer = new DateJsonSerializer();
    }
    if (clazz.equals(Integer.class)) {
        _nullJsonSerializer = new IntegerJsonSerializer();
    }
    return _nullJsonSerializer;
}

JsonSerializer可以构建工厂,这里我展示一个Spring的处理方法,大家举一反三吧

//创建一个SpringJsonSerializer 实现serialize方法
public class SpringJsonSerializer extends JsonSerializer<Object> {
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (o == null) {
//这里就是如果值为null你需要改为什么值了
            jsonGenerator.writeString("");
        }
    }
}

全部配置好了之后,我怎么让我写的生效的呢。

创建一个JacksonConfig

此代码中包含了将Boolean 类型转成对应的 NUMBER  即0为false,1为true

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import com.fasterxml.jackson.databind.ObjectMapper;
// null转为空字符串
@Configuration
public class JacksonConfig  {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

//此处为将Boolean 类型转成对应的 NUMBER  即0为false,1为true

objectMapper .configOverride(Boolean.class) .setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.NUMBER));
//在此配置上面的Modifier objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier())); return objectMapper; } }

好了下面就生效了。

参考资料:

  【私人定制jackson】定制jackson的自定义序列化(null值的处理) - 大招无限 - 博客园

  springboot 使用jackson,配置null值返回空字符串 - 夏秋初 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值