Сериализация Джексона JSON: как игнорировать вложенный объект, когда все его поля равны нулю? - PullRequest
0 голосов
/ 24 апреля 2018

Я использую Джексона, и у меня есть несколько объектов схемы 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, поэтому я не хочу это менять.Есть ли способ заставить Джексона обрабатывать объекты с пустыми полями как нулевые с помощью специального сериализатора?Я видел примеры использования пользовательских сериализаторов для определенных типов объектов, но мне нужен такой, который бы работал для любого объекта.

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете достичь этого возможно более простым способом без специального сериализатора (ов) для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...