当前位置: 首页 > 知识库问答 >
问题:

Gson仅在非空或非空时序列化字段

萧英睿
2023-03-14

我使用了Gson,但我需要转换器只序列化非空值或非空值。

例如:

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

现在,将该对象转换为json的Gson实例如下所示

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

共有1个答案

邹华皓
2023-03-14

创建自己的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"}
 类似资料:
  • 我使用Gson与改造。我的服务器接受空值,所以在我给的gson构建器 这样就不会忽略空值。但是在一些s中,我有一个特殊的情况,其中一些字段应该存在,即使是它的null,而其他一些字段如果是null也不应该序列化。 例如,如果我有一个请求类,比如 如果我有一个请求,其中和,应该将其序列化如下: 这意味着,如果type为null,它应该忽略该字段,但是如果id为null,它应该在请求中显示为null。

  • 问题内容: 我有需要将Java对象转换为json的要求。 我为此使用Gson,但我需要转换器仅序列化非null或非空值。 例如: 现在我的Gson实例将此对象转换为json看起来像 在上面的打印中,结果是 在这里我只是希望结果是 由于test2为空,otherObject为空,我不希望它们被序列化为json数据。 顺便说一句,我使用的是Groovy / Grails,因此,如果有任何对此的插件会很

  • 问题内容: 是否可以执行仅包含NOT NULL值的select语句? 现在我正在使用这个: 然后,我必须用php循环过滤掉空值。 有没有办法做: ? 现在,当我选择*时,我得到val1,val2,val3,null,val4,val5,null,null等。但是我只想获取结果中不为null的值。没有循环过滤就可以吗? 问题答案: 您应该使用。(比较操作符和两个给定与上表达的任一侧)。 为了完整起见

  • 我试图反序列化这个json对象数组: 我的java类看起来像这样: 问题在于json的tags属性,它可以是空字符串或数组。现在gson给了我一个错误: 我应该如何反序列化这个json? 我对这个json没有任何控制,它来自第三方api。

  • 但我们只对其中一些答案感兴趣。 注意:以上只是展示结构的示例。每个映射都有几十个元素。 我们真正需要的是:https://github.com/pact-foundation/pact-specification/issues/38,但它是计划在V.4中使用的。与此同时,我们正在尝试一种不同的方法。我现在尝试做的是指定列表的每个元素都是一个非空映射。另一种方法是指定列表的每个元素都不为空。这些都可

  • 问题内容: 我需要使用基于两个DATETIME列的最大值的公式更新一行。我通常会这样做: 但是,两个列都可以为NULL。即使另一个为NULL,我也需要最大的日期(当然,当两个都为NULL时,我希望为NULL),并且当其中一列为NULL时,返回NULL。 这似乎可行: 但我想知道…我错过了更直接的方法吗? 问题答案: