【问题标题】:gson exclusion strategy apply only to fields of target objectgson 排除策略仅适用于目标对象的字段
【发布时间】:2016-01-30 09:23:41
【问题描述】:

我想阻止 Gson 序列化特定类型的字段。为此,我创建了一个排除策略。排除策略确实成功地识别出所讨论的类何时被处理并且它确实成功地排除了它。不幸的是,它阻止我序列化该类的对象,即使它们是根。我的意思是它们是传递给 gson.toJson() 方法的参数。

更清楚地说,我有一个 Person 类型的类,其类字段本身涉及 Person 类型。我不想序列化 Person 类型的类字段。

public class Person{
   private Person child;
   private String name;
}

因此,在上面的示例中,我想要一个包含 name 字段但不包含 child 字段的 json 对象。我希望解决方案对字段类型敏感,而不是字段名称。

【问题讨论】:

    标签: java serialization gson field


    【解决方案1】:

    ExclusionStrategy 定义了两种方法,一种用于排除类型,一种用于排除字段。只需使用 field 方法跳过Person 类型的任何字段。

    class PersonExcluder implements ExclusionStrategy {
        @Override
        public boolean shouldSkipField(FieldAttributes f) {
            return f.getDeclaredType().equals(Person.class);
        }
    
        @Override
        public boolean shouldSkipClass(Class<?> clazz) {
            return false;
        }
    }
    

    然后使用注册它

    Gson gson = new GsonBuilder().setExclusionStrategies(new PersonExcluder()).create();
    

    【讨论】:

    • 我这样做了。但是,当我将 Person 传递给 gson.toJson() 时,它返回 null。我认为它没有序列化任何东西,因为该对象被排除在外,它可能是别的东西吗?
    • 是的,您传递给它的值很可能是 null。以上适用于 2.3.1。
    • 所以我只是单步执行了代码,发现传递给 gson.toJson() 的值不为空。它肯定有一个对象的实例进入,出来的是一个值为:“null”的字符串。但是,由于您的示例,我注意到我已将检查放入方法“shouldSkipClass”而不是“shouldSkipField”。这是我对传递给“shouldSkipClass”的类的误解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2018-09-17
    相关资源
    最近更新 更多