You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何全局配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:37:41