当前位置: 首页 > 面试题库 >

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

蓝苗宣
2023-03-14
问题内容

我有需要将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

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是番石榴课。如果您不需要这种依赖性,则可以自己进行检查。



 类似资料:
  • 我想序列化特定字段或类的空值。 在GSON中,选项适用于整个JSON。 例子: 使用GSON创建JSON: 电流输出: 期望输出: 如何达到预期的输出? 首选解决方案应具有以下特性: 默认情况下不要序列化空值 为具有特定注释的字段序列化空值。

  • 我使用了Gson,但我需要转换器只序列化非空值或非空值。 例如: 现在,将该对象转换为json的Gson实例如下所示

  • 首先,我想说这是一个大学项目。 我有三节课<代码>订单抽象类和从订单继承的和类。 我使用Gson序列化/反序列化子类,但我遇到了一点问题。订单类有一个字段,gson使用该字段来确定订单类型,DineIn或Delivery。 序列化工作得很好。问题是,每当我尝试反序列化时,类型字段值都不会读取,并且总是设置为null,即使它存在于JSON文件中。当有很多字段时,就会发生这种情况,因为当我尝试在较小的

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

  • 问题内容: 我有这个架构: 我想用Gson序列化Data对象,并得到类似的东西: 为此,我必须对学生部分使用自定义序列化程序,以便Gson仅打印学校的ID。但是对于学校来说,我必须有正常的序列化器。 我如何只用一个Gson对象就能完成所有工作? 问题答案: 您可以编写自定义序列化器,如下所示: