Сериализация Jackson JSON: как игнорировать вложенный объект, когда все его поля равны нулю?

Я использую Джексон, и у меня есть некоторые объекты схемы JSON, настроенные примерно так:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Person {

    String name;
    Child child = new Child();
    Sibling sibling = new Sibling();

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Child getChild() {
        return child;
    }
    public void setChild(Child child) {
        this.child = child;
    }

    public Sibling getSibling() {
        return sibling;
    }
    public void setSibling(Sibling sibling) {
        this.sibling = sibling;
    }
}

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Child {

    String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Sibling {

    String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Я пытаюсь игнорировать все пустые или пустые поля, и это нормально. Но я также хочу игнорировать объекты с пустыми или пустыми полями. Например:

Person person = new Person();
person.setName("John Doe");
ObjectMapper mapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(person);

Результирующая строка JSON - {"name":"John Doe","child":{},"sibling":{}}, но я хочу, чтобы она была {"name":"John Doe"}. Child и Sibling необходимо инициализировать при создании Person, поэтому я не хочу это менять. Есть ли способ заставить Джексона обрабатывать объекты с нулевыми полями как нулевые с помощью настраиваемого сериализатора? Я видел примеры использования пользовательских сериализаторов для определенных типов объектов, но мне нужен тот, который работал бы с любым объектом.

Вы должны написать собственный десериализатор stackoverflow.com/questions/40366524/…

Pankaj Gadge 24.04.2018 20:23

Я ищу решение для сериализации, а не десериализации, а также такое, которое работает со всеми типами объектов.

David DeMar 28.04.2018 23:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
2
2 924
1

Ответы 1

Вы можете добиться этого, возможно, более простым способом без специального сериализатора (ов) для Person или Child и Sibling, но с включением CUSTOM и передачей типа поля в качестве фильтра.

Прежде всего определите правильные методы equals для Child и Sibling. Затем, чтобы отфильтровать вложенные объекты, которые равны тому, что вернет их конструктор по умолчанию, аннотируйте соответствующие геттеры в Person следующим образом:

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Child.class)
public Child getChild() {
    return child;
}

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = Sibling.class)
public Sibling getSibling() {
    return sibling;
}

Установка valueFilter на Child.class выше приводит к созданию объекта с конструктором по умолчанию Child emptyChild = new Child(), а затем к решению, что другой объект Child child должен быть сериализован, проверяет, что emptyChild.equals(child) является ложным.

документы для valueFilter

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