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.
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.
JSON data has the concept of null and empty arrays and objects.
By default, GSON excludes transient and static fields from the serialization/deserialization process.
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();
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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With