Мне нужно иметь возможность предотвратить сериализацию определенных полей объектов, в первую очередь в зависимости от их типа.Например, рассмотрим следующий объект:
class MyPojo {
private int myInt;
private boolean myBoolean;
// getters, setters, etc.
}
Я хотел бы иметь возможность при сериализации не сериализовать логическое поле, если оно ложно.Или не сериализуйте int, если он равен нулю.По сути, не сериализуйте какое-либо конкретное поле на основе какого-либо свойства его типа или определенного значения.
Мне известны JsonSerializer, которые я использовал для частичного решения своей проблемы, но выбрать невозможноне сериализовать поле в 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
, допустимо применять фильтр к полю, а не ко всему классу, что было бы замечательно, но я попробовал это и не могу заставить его работать.