Exclude empty objects, empty arrays and arrays of empty objects from json response

Viewed 2296

Goal

How can I exclude all empty json objects {}, arrays [] or arrays of empty objects [{},{}] from the JSON response produced by Jackson in a RestController ?

Requirements and context

I'm building a Spring Boot REST API for a client. The API sends requests to a database and must produce a JSON response.

Constraints:

  • The DAO layer sends native SQL queries and receives huge DB results as a List. Developers have to manually map this result to Java objects using indexes (see code below)
  • SQL queries return a lot of null values (these queries can NOT be modified). Because of these null values, Java objects having only null-valued fields are frequently instantiated

Requirements:

  • All fields having null value must be excluded from JSON responses. Already implemented using Jackson @JsonInclude(JsonInclude.Include.NON_NULL) annotation
  • All empty json objects {} or arrays [], or arrays of empty objects [{},{}] must be excluded from the JSON response. This is where I'm stuck (Please see example below)

Code

Manual mapping in DAO layer:

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 ;
    }
}

Controller method:

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

All DTO classes which must be serialized in the JSON response extend the BaseDto class:

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

Actual and expected results

Current JSON output:

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

Expected:

{
  prop1: "some string"
}
1 Answers

Try to use NON_EMPTY

@JsonInclude(JsonInclude.Include.NON_EMPTY) 

Value that indicates that only properties with null value, or what is considered empty, are not to be included.

Related