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);
}
}
}
Comments | NOTHING