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

Java序列化时如何用JSON注解排除空Address对象字段?

Jackson序列化空对象时排除字段的解决方案

你之前用的@JsonInclude(JsonInclude.Include.NON_NULL)只能排除值为null的字段,但你的add是一个已经实例化的Address对象(只是内部所有字段都为null),所以这个注解不起作用。可以试试下面几种方案:

方案1:改用@JsonInclude(Include.NON_EMPTY)

这个枚举值会自动排除空对象、空集合、空字符串这类“空值”场景。你可以直接把注解加到X类的add字段上,或者全局配置让所有空对象都被排除:

字段级配置

class X{
  @JsonInclude(JsonInclude.Include.NON_EMPTY)
  Address add;
}

全局配置(适用于Spring项目)

如果想让所有空对象都不被序列化,在配置类里全局设置ObjectMapper:

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper()
                .setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    }
}

方案2:自定义空对象判断过滤器

如果NON_EMPTY的默认判断逻辑不符合你的需求(比如Address里有默认值字段,需要更精准的判断),可以自定义一个过滤器类,通过@JsonInclude的valueFilter属性指定:

编写自定义过滤器

public class EmptyAddressFilter {
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Address)) return false;
        Address addr = (Address) obj;
        // 这里自定义判断逻辑:当str和pincode都为null时,视为空对象
        return addr.getStr() == null && addr.getPincode() == null;
    }
}

应用到字段

class X{
  @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = EmptyAddressFilter.class)
  Address add;
}

这样当add符合过滤器定义的空对象条件时,序列化就会自动排除这个字段。

方案3:自定义序列化器

如果需要更复杂的序列化逻辑,可以给Address类编写自定义序列化器,在序列化时判断对象是否为空,为空则不输出:

实现自定义序列化器

public class AddressSerializer extends StdSerializer<Address> {
    public AddressSerializer() {
        super(Address.class);
    }

    @Override
    public void serialize(Address value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        // 判断是否为空对象
        if (value.getStr() == null && value.getPincode() == null) {
            return; // 空对象,不输出
        }
        // 正常序列化字段
        gen.writeStartObject();
        gen.writeStringField("str", value.getStr());
        gen.writeStringField("pincode", value.getPincode());
        gen.writeEndObject();
    }
}

注册序列化器

在Address类上添加注解,指定使用这个序列化器:

@JsonSerialize(using = AddressSerializer.class)
class Address{
 String str;
 String pincode;
 // 记得添加getter和setter方法
}

之后配合X类字段上的@JsonInclude(NON_NULL),就能实现空对象时排除add字段的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:25:19