Gson 仅在不为空或不为空时才序列化字段 [英] Gson Serialize field only if not null or not empty
问题描述
我有需要将 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屋!