Джексон - определить пустые поля без использования JsonSerializer & BeanSerializerModifier - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть pojo с множеством полей pojo, и я сериализую их, используя Джексона.Например:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FOO {
    private BOO boo = new BOO();
    private GOO goo = new GOO();

    // Getters & setters
}

Внутренний класс BOO определен, например:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class BOO {
    private AAA aaa = new AAA();
    private BBB bbb = new BBB();

    // Getters & setters
}

Теперь я хотел бы, чтобы класс BOO был сериализован в JSON только тогда, когда все его поля (aaa, bbb в моем примере) являются нулевыми или пустыми.Я прочитал здесь и здесь , что я могу сделать это с помощью JsonSerializer & BeanSerializerModifier.

Но мне интересно, есть ли более чистый способ сделать это, безопределение дополнительного класса для каждого настраиваемого поля, которое я хочу обработать.Например, было бы неплохо, если бы я мог как-то переопределить и реализовать метод isEmpty () Джексона для моего объекта BOO (реализуя некоторый интерфейс Джексона).

Есть ли такой более простой способ сделать это?

РЕДАКТИРОВАТЬ:

Я хотел бы иметь возможность сделать следующее, не проверяя наличие нулей:

foo.getBoo().getAaa();

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы можете получить трюк, переопределяющий сериализацию свойства boo с аннотацией @JsonGetter.Я упростил модели только ради примера.

Упрощенный класс FOO:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FOO {
    private BOO boo = new BOO();    

    @JsonGetter("boo")
    private BOO serializeEmptyBOO() {
        if (this.boo.isEmpty()) {
            return this.boo;
        }

        return null;
    }

    // Getters & setters
}

Упрощенный класс BOO:

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

    @JsonIgnore
    public boolean isEmpty() {
        // Your isEmpty implementation
    }
}
0 голосов
/ 24 сентября 2018

Это легко сделать с помощью логики в методе получения:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FOO {
    private BOO boo = new BOO();
    private GOO goo = new GOO();

    public BOO getBoo() {
        //replace if block with "empty" check logic
        if(this.boo.getAaa() == null || this.boo.getBbb() == null) {
            return this.boo;
        }

        return null;
    }
}

В сочетании с инструкцией @JsonInclude(JsonInclude.Include.NON_EMPTY) поле не будет включено при нулевом значении.

Конечно,как вы упомянули, вы можете добавить isEmpty() к BOO и вызвать его из метода получателя.

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