Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you get GSON to omit null or empty objects and empty arrays and lists?

Tags:

java

json

gson

I am using Gson and I am in a situation in which I have to shrink the size of certain Json strings. I would like to do so by getting it to not put null objects, only empty values, and empty lists and arrays into the Json string.

Is there a straightforward way to do that?

Let me clarify a bit: I want everything that says: emptyProp:{} or emptyArray:[] to be skipped. I want any object that only contains properties that are empty to be skipped.

like image 275
Joe Avatar asked Aug 13 '12 20:08

Joe


People also ask

How do I ignore null values in Gson?

The default behavior that is implemented in Gson is that null object fields are ignored. For example, if in Employee object, we do not specify the email (i.e. email is null ) then email will not be part of serialized JSON output. Gson ignores null fields because this behavior allows a more compact JSON output format.

Can you have an empty array in JSON?

JSON data has the concept of null and empty arrays and objects.

Does Gson ignore transient fields?

By default, GSON excludes transient and static fields from the serialization/deserialization process.


2 Answers

Null values are excluded by default as long as you don't set serializeNulls() to your GsonBuilder.

A way for empty lists is to create a JsonSerializer

class CollectionAdapter implements JsonSerializer<List<?>> {
  @Override
  public JsonElement serialize(List<?> src, Type typeOfSrc, JsonSerializationContext context) {
    if (src == null || src.isEmpty()) // exclusion is made here
      return null;

    JsonArray array = new JsonArray();

    for (Object child : src) {
      JsonElement element = context.serialize(child);
      array.add(element);
    }

    return array;
  }
}

Then register it

Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Collection.class, new CollectionAdapter()).create();
like image 75
PomPom Avatar answered Sep 20 '22 04:09

PomPom


According to PomPom a HashMap can serialized via:

class MapAdapter implements JsonSerializer<Map<?, ?>> {
        @Override
        public JsonElement serialize(Map<?, ?> src, Type typeOfSrc,JsonSerializationContext context) {
            if (src == null || src.isEmpty())
                return null;
            JsonObject obj = new JsonObject();
            for (Map.Entry<?, ?> entry : src.entrySet()) {
                obj.add(entry.getKey().toString(), context.serialize(entry.getValue()));
            }
        return obj;
        }
    }
like image 36
cbit Avatar answered Sep 21 '22 04:09

cbit