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

gson仅序列化某些字段的空值

章鸿光
2023-03-14

我使用Gson与改造。我的服务器接受空值,所以在我给的gson构建器

gsonBuilder.serializeNulls();

这样就不会忽略空值。但是在一些APIs中,我有一个特殊的情况,其中一些字段应该存在,即使是它的null,而其他一些字段如果是null也不应该序列化。

例如,如果我有一个请求类,比如

class Request {
    String id;
    String type;
}

如果我有一个请求,其中id=nulltype=nullgson应该将其序列化如下:

{
    id : null
}     

这意味着,如果type为null,它应该忽略该字段,但是如果id为null,它应该在请求中显示为null。

目前它正在序列化,如:

{
     id : null, 
     type:null
}  

因为我已经给出了gsonBuilder。序列化null() 。我该如何处理这个特殊情况?


共有1个答案

巫马安怡
2023-03-14

这是我的代码:

public static void main(String[] args) throws SecurityException,
            NoSuchFieldException, ClassNotFoundException {
        GsonBuilder gson = new GsonBuilder();
        Request request = new Request();
        Gson g = gson.serializeNulls()
                .setExclusionStrategies(new TestExclStrat(request)).create();
        System.out.println(g.toJson(request));
    }

class Request {
    public String id;
    public String type;
}

class TestExclStrat implements ExclusionStrategy {

    private Object obj;

    public TestExclStrat(Object obj) throws SecurityException,
            NoSuchFieldException, ClassNotFoundException {
        this.obj = obj;
    }

    public boolean shouldSkipClass(Class<?> arg0) {
        return false;
    }

    public boolean shouldSkipField(FieldAttributes f) {
        if (obj instanceof Request) {
            System.out.println(f.getName());
            if (!"id".equals(f.getName())) {
                try {
                    Field field = obj.getClass().getDeclaredField(f.getName());
                    field.setAccessible(true);
                    if (field.get(obj) == null) {
                        return true;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

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

  • 问题内容: 我使用GSON进行序列化时,没有找到一种方法,无法根据Gson根据字段值提供的ExclusionStrategy类从序列化中排除某些字段,因为它仅支持基于顶级类或字段属性的排除。字段属性不包括该字段的值。所以我该怎么做? 问题答案: 实现此目的的方法是为相关类创建自定义序列化程序。在允许Gson以默认方式创建JSON对象之后,请根据其值删除要排除的属性。 并在用于此类的应用程序中用于序

  • 我有一个大的嵌套对象。我想在JSON字符串中序列化这个对象,但是我只需要包含某些字段。这里的问题是字段可能会非常频繁地更改,我希望以一种可以帮助我轻松包含或排除用于序列化的字段的方式来构建它。 我知道我可以编写很多代码来提取某些字段并“手动”构建JSON。但我想知道,除了指定一个必填字段列表之外,是否还有其他优雅的方法可以实现类似的结果? 例如,我希望在响应中只包含和以下对象结构: Json:

  • 是否有方法序列化类的瞬态字段?文档中提到默认情况下不支持它,但是否有办法打开它? 非常感谢

  • 问题内容: 有没有一种使用Jackson JSON Processor进行自定义字段级序列化的方法?例如,我想上课 序列化为以下JSON: 请注意,age = 25被编码为 数字, 而favoriteNumber = 123被编码为 string 。开箱即用的杰克逊将集结到一个号码。在这种情况下,我希望将favoriteNumber编码为字符串。 问题答案: 您可以实现自定义序列化器,如下所示:

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