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

如何在Jackson自定义序列化器中排除空列表?

解决Jackson自定义序列化器跳过空列表字段的问题

问题原因

当使用自定义序列化器时,Jackson默认的@JsonInclude(JsonInclude.Include.NON_EMPTY)注解会失效。这是因为自定义序列化器的isEmpty()方法默认仅判断对象是否为null,而Collections.emptyList()返回的空列表并非null,因此Jackson会认为该字段非空,执行自定义序列化逻辑并输出空数组"list": []。

解决方案

方案一:重写自定义序列化器的isEmpty()方法

修改自定义序列化器,重写isEmpty()方法,让Jackson识别空列表为“空值”,从而触发NON_EMPTY的跳过规则:

public class CustomSerializer extends JsonSerializer<List<Object>> {
    // 重写isEmpty方法,判断列表是否为null或空
    @Override
    public boolean isEmpty(SerializerProvider provider, List<Object> list) {
        return list == null || list.isEmpty();
    }

    @Override
    public void serialize(final List<Object> list, final JsonGenerator jsonGenerator, final SerializerProvider serializers) throws IOException {
        jsonGenerator.writeStartArray();

        list.stream().forEach(item -> {
            if (item instanceof Map) {
                Map<String, String> entries = (Map<String, String>) item;
                entries.entrySet().stream().forEach(entry -> {
                    try {
                        jsonGenerator.writeStartObject();
                        jsonGenerator.writeStringField(entry.getKey(), entry.getValue());
                        jsonGenerator.writeEndObject();
                    } catch (IOException ex) {
                        throw new RuntimeException(ex);
                    }
                });
            }
        });

        jsonGenerator.writeEndArray();
    }
}

方案二:在序列化逻辑中主动判断并跳过

如果不想重写isEmpty(),也可以在serialize()方法开头添加判断,当列表为空时直接返回,不执行数组写入逻辑:

@Override
public void serialize(final List<Object> list, final JsonGenerator jsonGenerator, final SerializerProvider serializers) throws IOException {
    // 结合全局/字段级的NON_EMPTY配置,判断是否跳过空列表
    if (serializers.isEnabled(JsonInclude.Include.NON_EMPTY) && (list == null || list.isEmpty())) {
        return;
    }

    // 原有序列化逻辑
    jsonGenerator.writeStartArray();
    // ... 省略原有代码
    jsonGenerator.writeEndArray();
}

验证结果

修改后运行Main类,输出的JSON将不再包含空的list字段:

{
  "type" : "My Name",
  "name" : "My Type"
}

内容的提问来源于stack exchange,提问作者BATMAN_2008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:08:26