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

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

springboot响应返回json字段值为null根据字段类型统一处理,Boolean类型转成NUMBER_第1张图片

首先创建一个Modifier

public class MyBeanSerializerModifier extends BeanSerializerModifier {

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

    @Override
    public List changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List 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 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 {
    @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; } }

好了下面就生效了。

springboot响应返回json字段值为null根据字段类型统一处理,Boolean类型转成NUMBER_第2张图片

参考资料:

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

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

你可能感兴趣的:(后端,架构,spring,boot,json,spring)