小编典典

仅在不为null或不为空的情况下,Gson序列化字段

json

我有需要将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序列化类的建议,那将是很好的。


阅读 582

收藏
2020-07-27

共1个答案

小编典典

创建自己的 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 = new GsonBuilder().registerTypeAdapter(TestObject.class, new MyTypeAdapter()).create();
TestObject obj = new TestObject();
obj.test1 = "test1";
obj.test2 = "";
System.out.println(gson.toJson(obj));

产生

 {"test1":"test1"}

GsonBuilder班有一堆的方法来创建自己的序列化/反序列化战略,注册类型的适配器,等参数进行设置。

Strings是番石榴课。如果您不需要这种依赖性,则可以自己进行检查。

2020-07-27