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




Вы можете добиться этого, возможно, более простым способом без специального сериализатора (ов) для 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) является ложным.
Вы должны написать собственный десериализатор stackoverflow.com/questions/40366524/…