Gson Serialize field only if not null or not empty

groovy, gson, java, json, serialization

Solution

Create your own `TypeAdapter`

public class MyTypeAdapter extends TypeAdapter<TestObject>() {

    @Override
    public void write(JsonWriter out, TestObject value) throws IOException {
        out.beginObject();
        if (!Strings.isNullOrEmpty(value.test1)) {
            out.name("test1");
            out.value(value.test1);
        }

        if (!Strings.isNullOrEmpty(value.test2)) {
            out.name("test2");
            out.value(value.test1);
        }
        /* similar check for otherObject */         
        out.endObject();    
    }

    @Override
    public TestObject read(JsonReader in) throws IOException {
        // do something similar, but the other way around
    }
}

You can then register it with `Gson`.

Gson gson = new GsonBuilder().registerTypeAdapter(TestObject.class, new MyTypeAdapter()).create();
TestObject obj = new TestObject();
obj.test1 = "test1";
obj.test2 = "";
System.out.println(gson.toJson(obj));

produces

 {"test1":"test1"}

The `GsonBuilder` class has a bunch of methods to create your own serialization/deserialization strategies, register type adapters, and set other parameters.

`Strings` is a Guava class. You can do your own check if you don't want that dependency.

Problem

I have requirement where I need to convert java object to json. I am using Gson for that but i need the converter to only serialize the non null or not empty values. For example: ``` //my java object looks like class TestObject{ String test1; String test2; OtherObject otherObject = new OtherObject(); } ``` now my Gson instance to convert this object to json looks like ``` Gson gson = new Gson(); TestObject obj = new TestObject(); obj.test1 = "test1"; obj.test2 = ""; String jsonStr = gson.toJson(obj); println jsonStr; ``` In the above print, the result is ``` {"test1":"test1", "test2":"", "otherObject":{}} ``` Here i just wanted the result to be ``` {"test1":"test1"} ``` Since the test2 is empty and otherObject is empty, i don't want them to be serialized to json data. Btw, I am using Groovy/Grails so if there is any plugin for this that would be good, if not any suggestion to customize the gson serialization class would be good.

Original source

Related problems