Как управлять сериализацией библиотеки Джексона
У меня есть класс (давайте назовем это Piece
) содержащий член типа com.jme3.math.ColorRGBA
, С сериализацией по умолчанию Jackson член сериализуется не только как его члены r
, g
, b
а также a
, но затем также с помощью геттеров, таких как getAlpha
,
Поскольку это явно избыточно, я хотел бы контролировать сериализацию и сериализацию только тех основных членов. Есть ли какие-нибудь аннотации, которые я могу написать в свой класс, чтобы контролировать сериализацию членов с типами, не находящимися под моим контролем, или какие-то пользовательские сериализаторы для них?
Я, вероятно, могу написать собственный сериализатор для Piece
Класс, хотя сериализатор ColorRGBA и слишком многословен, сериализация по умолчанию работает хорошо для всех остальных свойств Piece
Поэтому я хотел бы настроить как можно меньше.
Я не хочу изменять jme3
библиотека источник, решение должно быть реализовано за пределами ColorRGBA
учебный класс.
3 ответа
Вы можете использовать миксин, чтобы убедиться, что класс сериализован в соответствии с вашими потребностями. Учтите следующее:
// The source class (where you do not own the source code)
public class ColorRGBA {
public float a; // <-- Want to skip this one
public float b;
public float g;
public float r;
}
Затем создайте миксин, где вы игнорируете a
имущество.
// Create a mixin where you ignore the "a" property
@JsonIgnoreProperties("a")
public abstract class RGBMixin {
// Other settings if required such as @JsonProperty on abstract methods.
}
Наконец, настройте ваш маппер с помощью mixin:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(ColorRGBA.class, RGBMixin.class);
System.out.println(mapper.writeValueAsString(new ColorRGBA()));
Выход будет:
{ "Ъ": 0,0, "г": 0.0, "г": 0,0}
Обратите внимание, что метод ObjectMapper.addMixInAnnotations
устарела по сравнению с Jackson 2.5 и должна быть заменена на более свободную версию:
mapper.addMixIn(ColorRGBA.class, RGBMixin.class);
JavaDocs можно найти здесь
Вариант А
Если вы контролируете источник класса, можете поставить это выше класса:
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
public class ColorRGBA {
Вариант Б
В противном случае вы можете настроить отображение объектов, чтобы игнорировать получатели:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.ANY)
.withGetterVisibility(JsonAutoDetect.Visibility.NONE)
.withSetterVisibility(JsonAutoDetect.Visibility.NONE)
.withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
mapper.writeValue(stream, yourObject);
Вариант С
Для более сложных требований вы можете написать свою собственную реализацию VisibilityChecker.
Можно написать собственный сериализатор только для члена, используя аннотацию для члена, например:
@JsonSerialize(using = CustomColorRGBASerializer.class)
ColorRGBA color;
См. Также этот ответ о том, как настраивать поле даты в произвольном порядке.