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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:48:03