
本文介绍通过自定义 Jackson 序列化器,实现仅当布尔字段 a 为 true 时才序列化整型字段 b,避免硬编码逻辑或重复注解,兼顾灵活性与可维护性。
本文介绍通过自定义 jackson 序列化器,实现仅当布尔字段 `a` 为 `true` 时才序列化整型字段 `b`,避免硬编码逻辑或重复注解,兼顾灵活性与可维护性。
在 Jackson 中,@JsonInclude 注解虽支持条件序列化(如 NON_NULL、NON_EMPTY),但无法直接表达“仅当另一字段为 true 时才包含某字段”这类跨字段依赖逻辑。此时,最清晰、可控且符合 Jackson 设计范式的方案是实现自定义序列化器。
以下是一个完整、可直接运行的示例:
public class MyClass {
private boolean a;
private int b;
// 必须提供 getter(Jackson 默认使用 getter)
public boolean isA() { return a; }
public int getB() { return b; }
// 构造器和 setter(可选,用于测试)
public MyClass(boolean a, int b) {
this.a = a;
this.b = b;
}
}
接着编写专用序列化器:
public class MyClassSerializer extends JsonSerializer<myclass> {
@Override
public void serialize(MyClass value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeStartObject();
gen.writeBooleanField("a", value.isA());
if (value.isA()) {
gen.writeNumberField("b", value.getB());
}
gen.writeEndObject();
}
}</myclass>
最后,在目标类上通过 @JsonSerialize 指定该序列化器:
@JsonSerialize(using = MyClassSerializer.class)
public class MyClass {
// 字段与 getter 同上
}
✅ 关键注意事项:
- 自定义序列化器会完全接管对象的 JSON 输出结构,因此需显式写出所有需保留的字段(如本例中的
"a");遗漏字段将导致其不出现于最终 JSON。 - 若类后续新增字段(如
c、name),必须同步更新serialize()方法,否则新字段不会被序列化。建议搭配单元测试验证输出完整性。 - 如需同时支持反序列化,应额外实现
JsonDeserializer<myclass></myclass>并配合@JsonDeserialize注解。 - 对于复杂条件或多个依赖字段的场景,可将判断逻辑提取为独立工具方法(如
shouldIncludeB(MyClass obj)),提升可读性与复用性。
该方案优于 @JsonInclude(CUSTOM) 配合 ValueFilter 的方式——后者要求为每个条件字段单独配置,难以表达“字段间逻辑关联”,而自定义序列化器将控制权完全交还开发者,语义明确、调试直观,是处理动态序列化规则的推荐实践。










