我需要能够防止对象的某些字段被序列化,主要是基于它们的类型。例如,考虑以下对象:
class MyPojo {
private int myInt;
private boolean myBoolean;
// getters, setters, etc.
}
如果布尔字段为假,我希望能够在序列化时不序列化布尔字段。或者如果它为零,则不序列化 int。基本上,不要根据其类型或特定值的任何属性序列化任何特定字段。
我知道 JsonSerializers,我曾经用它来部分解决我的问题,但不可能选择不序列化 JsonSerializer 中的字段。
我最接近的是实现我自己的 PropertyFilter,并通过以下方式将其应用于我的对象@JsonFilter
:
public class XmlPropertyFilter implements PropertyFilter {
@Override
public void serializeAsField(Object pojo, JsonGenerator gen, SerializerProvider prov, PropertyWriter writer) throws Exception {
JavaType type = writer.getType();
if (writer instanceof BeanPropertyWriter) {
BeanPropertyWriter bWriter = (BeanPropertyWriter) writer;
String fieldName = bWriter.getSerializedName().getValue();
Field f = pojo.getClass().getDeclaredField(fieldName);
f.setAccessible(true);
Object value = f.get(pojo);
if (!type.isTypeOrSubTypeOf(int.class) && value != null) {
// Serialize everything that isn't an int and doesn't have a null value
prov.defaultSerializeField(fieldName, value, gen);
} else if (type.isTypeOrSubTypeOf(int.class)) {
// Only serialize ints if the value isn't 0
if (value != 0) prov.defaultSerializeField(fieldName, value, gen);
}
}
}
// ...
}
这正是我想要的,除了它具有破坏包装的令人讨厌的副作用(例如序列化列表)。根据@JsonFilter
文档,将过滤器应用于字段而不是整个类是有效的,这会很棒,但我已经尝试过了,但似乎无法让它工作。