Добавление свойства с помощью Jackson MixIn? - PullRequest
1 голос
/ 31 октября 2019

Я знаю, что мы можем использовать Jackson MixIn's, чтобы переименовать свойство или игнорировать свойство (см. Примеры здесь ). Но возможно ли добавить свойство?

Добавленное свойство может быть:

  1. Константа (например, номер версии)
  2. Вычисляемое значение (например,если исходный класс имеет свойства для getWidth() и getHeight(), но мы хотим игнорировать оба и экспортировать getArea() вместо этого
  3. Сведенная информация от вложенных членов (например, класс имеет член Informationкоторый, в свою очередь, имеет член Description, и мы хотим иметь новое свойство для description и пропуск структуры вложенности Information)

1 Ответ

1 голос
/ 02 ноября 2019

Из документации :

Смешанные аннотации - это способ связать аннотации с классами без изменения самих (целевых) классов, изначально предназначенных для поддержки поддержки 3-готипы данных для вечеринок, где пользователь не может изменять источники для добавления аннотаций.

С дополнительными модулями вы можете:
1. Определить, что аннотации '' 'смешанного класса' '' (или интерфейса)
2. будет использоваться с '' 'целевым классом' '' (или интерфейсом) таким образом, что будет выглядеть
3. как если бы у '' target class '' были все аннотации, что '' mix-in '''класс имеет (в целях настройки сериализации / десериализации)

Для решения ваших проблем вы можете:

  • Создать новый POJO, который имеет все обязательные поля.
  • Реализация пользовательского сериализатора.
  • Перед сериализацией преобразуйте POJO в Map и добавьте / удалите узлы.
  • Используйте com.fasterxml.jackson.databind.ser.BeanSerializerModifier для расширения пользовательских сериализаторов. См .: Пользовательская сериализация и десериализация Джексона .

Например, чтобы добавить постоянную версию для каждого объекта, вы можете заключить ее в класс Verisoned:

class Versioned {

    private final String version;

    @JsonUnwrapped
    private final Object pojo;

    public Versioned(String version, Object pojo) {
        this.version = version;
        this.pojo = pojo;
    }

    public String getVersion() {
        return version;
    }

    public Object getPojo() {
        return pojo;
    }
}

Теперь, если вы оберните объект Arae(width, height):

Area area = new Area(11, 12);
String json = mapper.writeValueAsString(new Versioned("1.1", area));

, результат будет:

{
  "version" : "1.1",
  "width" : 11,
  "height" : 12
}
...