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

