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.