Gson 仅在不为空或不为空时才序列化字段 [英] Gson Serialize field only if not null or not empty

查看:31
本文介绍了Gson 仅在不为空或不为空时才序列化字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有需要将 java 对象转换为 json 的要求.

I have requirement where I need to convert java object to json.

我为此使用 Gson,但我需要转换器仅序列化非空值或非空值.

I am using Gson for that but i need the converter to only serialize the non null or not empty values.

例如:

//my java object looks like
class TestObject{
    String test1;
    String test2;
    OtherObject otherObject = new OtherObject();
}

现在我的 Gson 实例将此对象转换为 json 看起来像

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":{}}

这里我只想结果是

{"test1":"test1"}

由于 test2 为空,otherObject 为空,我不希望它们被序列化为 json 数据.

Since the test2 is empty and otherObject is empty, i don't want them to be serialized to json data.

顺便说一句,我正在使用 Groovy/Grails,所以如果有任何插件会很好,如果没有任何自定义 gson 序列化类的建议会很好.

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.

推荐答案

创建自己的 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 注册它.

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));

产生

 {"test1":"test1"}

GsonBuilder 类有一堆方法来创建您自己的序列化/反序列化策略、注册类型适配器和设置其他参数.

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

Strings 是一个番石榴类.如果您不想要这种依赖,您可以自行检查.

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

这篇关于Gson 仅在不为空或不为空时才序列化字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆