Исключить пустые объекты, пустые массивы и массивы пустых объектов из ответа json - PullRequest
1 голос
/ 20 июня 2019

Цель

Как можно исключить все пустые объекты json {}, массивы [] или массивы пустых объектов [{},{}] из ответа JSON, выданного Джексоном в RestController?

Требования и контекст

Я создаю Spring Rot API REST для клиента. API отправляет запросы в базу данных и должен выдать ответ JSON.

Ограничения:

  • Уровень DAO отправляет собственные запросы SQL и получает огромные результаты БД в виде списка. Разработчики должны вручную сопоставить этот результат с объектами Java с помощью индексов (см. Код ниже)
  • SQL-запросы возвращают много нулевых значений (эти запросы НЕ МОГУТ быть изменены). Из-за этих нулевых значений часто создаются экземпляры Java-объектов, имеющих только нулевые поля

Требования:

  • Все поля, имеющие нулевое значение, должны быть исключены из ответов JSON. Уже реализовано с использованием аннотации Jackson @JsonInclude(JsonInclude.Include.NON_NULL)
  • Все пустые объекты json {} или массивы [], или массивы пустых объектов [{},{}] должны быть исключены из ответа JSON. Вот где я застрял (см. Пример ниже)

код

Ручное отображение в слое DAO:

public List<A> daoMethod() {
    List<Object[]> dbResult = getDbResults();
    List<A> javaObjects = new ArrayList<>();

    // build nested Java objects
    for (Object[] line in dbResult) {
        A a = new A();
        a.setProp1(line[0]);
        a.setProp2(line[1]);
        // and so on...
        javaObjects.add(a);
        return javaObjects ;
    }
}

Метод контроллера:

public ResponseEntity<A> controllerMethod() {
    List<A> javaObjects = myDao.daoMethod();
    return new ResponseEntity(javaObjects, HttpStatus.OK);
}

Все классы DTO, которые должны быть сериализованы в ответе JSON, расширяют класс BaseDto:

@JsonInclude(JsonInclude.Include.NON_NULL) // removes all fields having NULL value
public abstract class BaseDto implements Serializable{
    // some properties...
}

Фактические и ожидаемые результаты

Текущий вывод JSON:

{
  prop1: "some string",
  prop2: [{},{},{}],
  prop3: [],
  prop4: {},
}

Ожидаемое:

{
  prop1: "some string"
}

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вы можете использовать JsonInclude.Include.NON_EMPTY. Чтобы настроить сопоставление объектов с помощью этого параметра глобально, для приложения Spring Boot создайте bean-компонент в своей конфигурации:

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder()
            .serializationInclusion(JsonInclude.Include.NON_EMPTY);
}
0 голосов
/ 20 июня 2019

Попробуйте использовать NON_EMPTY

@JsonInclude(JsonInclude.Include.NON_EMPTY) 

Значение, которое указывает, что не должны включаться только свойства с нулевым значением или то, что считается пустым.

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