Jackson ObjectMapper如何在不修改原类前提下序列化时排除值为false的布尔字段
解决方案
方案1:使用自定义值过滤器(Jackson 2.9+ 推荐)
这是最简便的实现方式,核心是利用Jackson的@JsonInclude自定义过滤器规则,结合MixIn类无侵入修改序列化逻辑。
步骤1:实现布尔false值排除过滤器
// 过滤器逻辑:当字段值为false时,Jackson会自动排除该字段 public class BooleanFalseExclusionFilter { @Override public boolean equals(Object obj) { return Boolean.FALSE.equals(obj); } }
步骤2:修改MixIn类配置
在MixIn类中声明对应字段,添加序列化规则注解:
private static class MixInMyResponse { @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = BooleanFalseExclusionFilter.class) private boolean booleanValue; }
步骤3:修正ObjectMapper的MixIn注册逻辑
你原代码仅将MixIn注册到了反序列化配置,序列化阶段不会生效,需要改为全局注册:
public MyResponse readFromRemote() throws IOException { String jsonAsString = "{\"stringValue\":\"a\",\"intValue\":1,\"booleanValue\":false}"; ObjectMapper mapper = new ObjectMapper(); // 全局注册MixIn,序列化、反序列化阶段都会生效 mapper.addMixIn(MyResponse.class, MixInMyResponse.class); // 可选:如果MyResponse的private字段没有提供public getter方法,需要添加该配置允许访问字段 // mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); MyResponse myResponse = mapper.readValue(jsonAsString, MyResponse.class); String writeValue = mapper.writeValueAsString(myResponse); System.out.println(writeValue); return myResponse; }
测试效果:booleanValue为false时序列化结果无该字段,为true时正常返回。
方案2:自定义序列化器(兼容低版本Jackson)
如果使用的Jackson版本低于2.9,不支持Include.CUSTOM规则,可以用自定义序列化器实现:
步骤1:实现仅输出true的布尔序列化器
public class BooleanOnlyTrueSerializer extends JsonSerializer<Boolean> { @Override public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 仅当值为true时输出字段,false时不输出 if (Boolean.TRUE.equals(value)) { gen.writeBoolean(true); } } }
步骤2:修改MixIn类配置
private static class MixInMyResponse { @JsonSerialize(using = BooleanOnlyTrueSerializer.class) private boolean booleanValue; }
后续的ObjectMapper注册逻辑和方案1完全一致。
注意:如果MyResponse类提供了
isBooleanValue()格式的public getter方法,也可以直接在MixIn类中声明对应的getter方法并添加注解,不需要声明私有字段,效果一致。
内容的提问来源于stack exchange,提问作者Drex
相关产品推荐
相关产品推荐

