我有需要将Java对象转换为json的要求。
我为此使用Gson,但我需要转换器仅序列化非null或非空值。
例如:
//my java object looks like class TestObject{ String test1; String test2; OtherObject otherObject = new OtherObject(); }
现在我的Gson实例将此对象转换为json看起来像
Gson gson = new Gson(); TestObject obj = new TestObject(); obj.test1 = "test1"; obj.test2 = ""; String jsonStr = gson.toJson(obj); println jsonStr;
在上面的打印中,结果是
{"test1":"test1", "test2":"", "otherObject":{}}
在这里我只是希望结果是
{"test1":"test1"}
由于test2为空,otherObject为空,我不希望它们被序列化为json数据。
顺便说一句,我使用的是Groovy / Grails,因此,如果有任何对此的插件会很好,如果没有关于自定义gson序列化类的建议,那将是很好的。
创建自己的 TypeAdapter
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 } }
然后,您可以使用进行注册Gson。
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));
产生
该GsonBuilder班有一堆的方法来创建自己的序列化/反序列化战略,注册类型的适配器,等参数进行设置。
GsonBuilder
Strings是番石榴课。如果您不需要这种依赖性,则可以自己进行检查。
Strings