springboot的自带序列化jackson的使用 对不同类型的null字段进行设置指定值

时间:2025-03-10 07:45:15

JackSon是解析JSON和XML的一个框架,优点是简单易用,性能较高。

SpringBoot使用Jackson序列化时将null转成空字符串

简介
大家知道很多情况下,我们的API中数据交换都用JSON数据,这种数据格式简单、易读写、且轻量。在SpringBoot中默认使用jackson帮助我们进行序列化与反序列化的操作。

在控制层将我们的对象序列化返回给前端时,有些字段为null,序列化后的值也是null,如果前端直接展示的话,对用户不够友好,这里我们可以对jackson稍加修改,将值为null的转换成空字符串""。

不要使用继承MappingJackson2HttpMessageConverter的方式进行编写,可能会导致无法访问swgger文档的情况,但是接口是可以正常调用的

使用以下方式

可以根据不同类型的null转换成指定的值

package ;

import ;
import ;
import ;
import ;

/**
 * 自定义null值序列化处理器
 */
public class CustomizeNullJsonSerializer {

    /**
     * 处理数组集合类型的null值
     */
    public static class NullArrayJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
        					  SerializerProvider serializerProvider) throws IOException {
            ();
            ();
        }
    }

    /**
     * 处理字符串类型的null值
     */
    public static class NullStringJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
        					  SerializerProvider serializerProvider) throws IOException {
            ("");
        }
    }

    /**
     * 处理数值类型的null值
     */
    public static class NullNumberJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
                              SerializerProvider serializerProvider) throws IOException {
            (0);
        }
    }

    /**
     * 处理boolean类型的null值
     */
    public static class NullBooleanJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
                              SerializerProvider serializerProvider) throws IOException {
            (false);
        }
    }

    /**
     * 处理实体对象类型的null值
     */
    public static class NullObjectJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, 
                              SerializerProvider serializerProvider) throws IOException {
            ();
            ();
        }
    }

}
package ;

import ;
import ;
import ;
import ;

import ;
import ;

/**
 * <pre>
 * 此modifier主要做的事情为:
 * 1.当序列化类型为数组集合时,当值为null时,序列化成[]
 * 类型值序列化为""
 *
 * </pre>
 */
public class MyBeanSerializerModifier extends BeanSerializerModifier {

    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, 
                                                     BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        // 循环所有的beanPropertyWriter
        for (int i = 0; i < (); i++) {
            BeanPropertyWriter writer = (i);
            // 判断字段的类型,如果是数组或集合则注册nullSerializer
            /*if (isArrayType(writer)) {
                // 给writer注册一个自己的nullSerializer   
                (new ());
            }*/
            if (isStringType(writer)) {
                (new ());
            }
        }
        return beanProperties;
    }

    /**
     * 是否是数组
     */
    private boolean isArrayType(BeanPropertyWriter writer) {
        Class<?> clazz = ().getRawClass();
        return () || (clazz);
    }

    /**
     * 是否是String
     */
    private boolean isStringType(BeanPropertyWriter writer) {
        Class<?> clazz = ().getRawClass();
        return (clazz) || (clazz);
    }

    /**
     * 是否是数值类型
     */
    private boolean isNumberType(BeanPropertyWriter writer) {
        Class<?> clazz = ().getRawClass();
        return (clazz);
    }

    /**
     * 是否是boolean
     */
    private boolean isBooleanType(BeanPropertyWriter writer) {
        Class<?> clazz = ().getRawClass();
        return ();
    }

}
package ;

import ;
import ;
import ;
import ;
import ;
import ;
import .Jackson2ObjectMapperBuilder;

/**
 * 配置Jackson实体
 */
@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean()
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = (false).build();
        /** 为objectMapper注册一个带有SerializerModifier的Factory */
        (()
                .withSerializerModifier(new MyBeanSerializerModifier()));

        SerializerProvider serializerProvider = ();
        //(new ());
        return objectMapper;
    }
}

格式化date类型可以在properties或者yml中进行配置

全局统一

#date类型时间格式化
#-format=yyyy-MM-dd HH:mm:ss
#-date-time-format=yyyy-MM-dd HH:mm:ss
#-zone=GMT+8
#date类型转换时间戳
-dates-as-timestamps=true