如何全局配置Jackson将null List序列化为空数组?
嘿,这个全局把null List序列化成空数组的需求我熟!你之前注册自定义序列化器没生效,多半是没踩对Jackson处理集合类型的点。下面给你两种稳行的全局实现方案,完全不用给每个类加注解:
方案一:自定义List序列化器 + 全局Module注册
Jackson对集合类型的序列化有特殊处理逻辑,直接注册ArrayList.class这类子类序列化器覆盖不全,得针对抽象的List.class来注册才会全局生效。
第一步:实现自定义Null List序列化器
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.List; public class NullListSerializer extends JsonSerializer<List<?>> { @Override public void serialize(List<?> list, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 当List为null时输出空数组,否则走正常序列化逻辑 if (list == null) { gen.writeStartArray(); gen.writeEndArray(); } else { gen.writeObject(list); } } }
第二步:注册到ObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; public class JacksonConfigDemo { public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule customModule = new SimpleModule(); // 关键:注册针对List抽象类的序列化器,覆盖全局所有List类型的处理 customModule.addSerializer(List.class, new NullListSerializer()); objectMapper.registerModule(customModule); // 测试你的MyBean类 MyBean bean = new MyBean(); bean.setValues(null); String json = objectMapper.writeValueAsString(bean); System.out.println(json); // 输出:{"values": []} } } // 你的测试类 class MyBean { private List<String> values; // getter & setter public List<String> getValues() { return values; } public void setValues(List<String> values) { this.values = values; } }
方案二:用BeanSerializerModifier全局修改属性序列化逻辑
如果需要更灵活地控制所有Bean的List属性(比如只针对特定包下的类),可以用BeanSerializerModifier来批量修改属性的null序列化器。
第一步:实现BeanSerializerModifier
import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import java.util.List; public class NullListBeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { for (BeanPropertyWriter writer : beanProperties) { // 判断当前属性是否是List或其子类 if (List.class.isAssignableFrom(writer.getType().getRawClass())) { // 给该属性指定null时的序列化器 writer.assignNullSerializer(new NullListSerializer()); } } return beanProperties; } }
第二步:注册到ObjectMapper
ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializerFactory( objectMapper.getSerializerFactory() .withSerializerModifier(new NullListBeanSerializerModifier()) );
Spring Boot全局配置(如果是Spring项目)
如果用Spring Boot,直接把配置好的ObjectMapper作为Bean注入,就能全局生效:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @Configuration public class JacksonGlobalConfig { @Bean public ObjectMapper customObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(List.class, new NullListSerializer()); objectMapper.registerModule(module); return objectMapper; } }
内容的提问来源于stack exchange,提问作者Raipe
相关产品推荐
相关产品推荐

