package com.craftsman.content.config.jackson;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider;
import com.fasterxml.jackson.databind.ser.SerializerFactory;
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 java.io.IOException;

/**
 * 实现null转换的配置
 *
 * @author MaoSi-Amor
 * @date 2022年03月25日 18:07
 */
@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.setSerializerProvider(new CustomSerializerProvider());
        return objectMapper;
    }

    // 自定义解析器
    public static class CustomSerializerProvider extends DefaultSerializerProvider {

        // 定义JsonSerializer为写入空字符串
        private static final JsonSerializer<Object> nullStringToEmptySerializer = new JsonSerializer<>() {
            @Override
            public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeString("");
            }
        };

        // 定义
        private static final JsonSerializer<Object> nullIntegerToEmptySerializer = new JsonSerializer<>() {
            @Override
            public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeString("");
            }
        };

        @Override
        public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException {
            // 判断是否为String类型,是就重写为空字符串,否者走默认null的处理逻辑
            if (property.getType().getRawClass().equals(String.class)) {
                return nullStringToEmptySerializer;
            } else if (property.getType().getRawClass().equals(Integer.class)) {
                return nullIntegerToEmptySerializer;
            }
            return super.findNullValueSerializer(property);
        }

        // 给ObjectMapper参数new的构造函数,在父级会调用createInstance方法,下面重写了createInstance方法,走的是CustomSerializerProvider的有参构造
        public CustomSerializerProvider() {
            super();
        }

        public CustomSerializerProvider(SerializerProvider provider, SerializationConfig config, SerializerFactory jsf) {
            super(provider, config, jsf);
        }

        @Override
        public DefaultSerializerProvider createInstance(SerializationConfig config, SerializerFactory jsf) {
            return new CustomSerializerProvider(this, config, jsf);
        }
    }
}

 


欢迎欢迎~热烈欢迎~