Search code examples
javajsonserializationgroovygson

Gson Serialize field only if not null or not empty


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.


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.