22

I have an object that is curently being serialized to:

{
  "label" : "label",
  "proxyIds" : [ ],
  "childIds" : [ 161, 204, 206, 303, 311 ],
  "actionIds" : [ 157, 202 ],
}

That proxyIds is an empty (not null) collection in the java object.

How do I configure Jackson to not include that object in the json at all?

I want behaviour similar to "unwrapped" collections in xml/soap where if the collection is empty it is not included. I do not need to distinguish between null and empty collection and want to reduce the size of the json payload.

Michael Wiles
  • 20,902
  • 18
  • 71
  • 101

2 Answers2

49

Since Jackson 2.0.0 (25-Mar-2012), you can also use the @JsonInclude annotation to control this on a per-field or per-class basis.

public class MyObject {

    @JsonInclude(Include.NON_EMPTY)
    private List<Integer> proxyIds;

    ...
}
pimlottc
  • 3,066
  • 2
  • 29
  • 24
  • IMHO this should be the correct answer. But I find it worth mentioning that this annotation can also be used on a class. In this case it applies to all fields. – Simon Apr 29 '16 at 08:11
  • 2
    Just a note, NON_DEFAULT is a subset of NON_EMPTY, which one you want depends on you need. If I remember correct NON_EMPTY also removes empty strings properties in addition to arrays while NON_DEFAULT does not. – molholm Jun 29 '16 at 20:40
15

This may be a long shot but how about using Inclusions and defining NON_DEFAULT as the inclusion property. The docs say:

"Value that indicates that only properties that have values that differ from default settings (meaning values they have when Bean is constructed with its no-arguments constructor) are to be included."

So if the default value is an empty array it should skip it.

Something like:

ObjectMapper mapper = new ObjectMapper();
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_DEFAULT);


public class Test {
     String[] array = { };
     ....
}

http://jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/map/annotate/JsonSerialize.Inclusion.html

Usman Ismail
  • 17,999
  • 14
  • 83
  • 165