Удаление пустых JSON объектов из массива в сериализации Джексона - PullRequest
0 голосов
/ 27 мая 2020

У меня есть список в классе Java Pojo. Этот список содержит некоторые объекты MyChildPojo, которые не являются нулевыми, но могут иметь свойства с нулевыми значениями. Пример:

MyChildPojo obj1 = new MyChildPojo();
MyChildPojo obj2 = new MyChildPojo();

Я добавил @JsonInclude(JsonInclude.Include.NON_EMPTY) в свой класс MyChildPojo, поэтому пустые свойства не будут добавлены при сериализации объекта. Теперь мой окончательный сериализованный вывод для объекта List:

[
  {}, {}
]

В этом случае я хочу удалить весь объект List. Я попытался добавить @JsonInclude(JsonInclude.Include.NON_EMPTY) и @JsonInclude(value = Include.NON_EMPTY, content = Include.NON_EMPTY) в объект List, но все равно получил тот же результат.

Я могу использовать только аннотацию в моем случае. Можно ли это сделать?

1 Ответ

2 голосов
/ 28 мая 2020

Для этого вы можете использовать аннотации с настраиваемым фильтром. В настраиваемом фильтре вы можете полностью опустить свойство списка, когда весь набор MyChildPojo объектов - это просто оболочка.

Аннотировать MyChildPojo класс с

@JsonInclude(value = JsonInclude.Include.NON_EMPTY, valueFilter = EmptyListFilter.class)
public class MyChildPojo {
...
}

И определить EmptyListFilter что-то вроде следующего

public class EmptyListFilter {
    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof List)) {return false;}
        Optional<Object> result = ((List)obj).stream().filter(
                eachObj -> Arrays.asList(eachObj.getClass().getDeclaredFields()).stream().filter(eachField -> {
                    try {
                        eachField.setAccessible(true);
                        if ( eachField.get(eachObj)  != null && !eachField.get(eachObj).toString().isEmpty()) {
                            return true;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return false;
                }).count() > 0).findAny();
       return  !result.isPresent();
    }
}

Пример использует следующие зависимости от Java:8

   compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.11.0'
   compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
...