19

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.

Joe
  • 7,922
  • 18
  • 54
  • 83
  • 3
    Isn't that the default behavior? – mhusaini Aug 13 '12 at 20:58
  • 1
    No it puts in empty arrays, etc. – Joe Aug 13 '12 at 21:31
  • 4
    "it puts in empty arrays, etc." -- ??? I recommend posting a complete minimal example of what you're talking about. The docs say, "While serialization, a null field is skipped from the output" (but I wouldn't be surprised if this isn't correct). – Programmer Bruce Aug 13 '12 at 22:30
  • Then I am somewhat confused: "to not put null objects, _only_ empty values..." What does "only" mean here? Do you want empty values etc included or do you not want them included? – mhusaini Aug 14 '12 at 10:37
  • I want empty values, such as empty strings excluded. – Joe Aug 14 '12 at 14:15

2 Answers2

33

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();
mdev
  • 1,366
  • 17
  • 23
PomPom
  • 1,468
  • 11
  • 20
2

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;
        }
    }
Community
  • 1
  • 1
cbit
  • 53
  • 6