Как управлять сериализацией библиотеки Джексона

У меня есть класс (давайте назовем это 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;

См. Также этот ответ о том, как настраивать поле даты в произвольном порядке.

Другие вопросы по тегам