如何在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
相关产品推荐
相关产品推荐

