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

Java Gson:如何从没有注释的序列化中排除特定字段

齐嘉庆
2023-03-14
问题内容

我正在尝试学习Gson,并且在领域排除方面苦苦挣扎。这是我的课

public class Student {    
  private Long                id;
  private String              firstName        = "Philip";
  private String              middleName       = "J.";
  private String              initials         = "P.F";
  private String              lastName         = "Fry";
  private Country             country;
  private Country             countryOfBirth;
}

public class Country {    
  private Long                id;
  private String              name;
  private Object              other;
}

我可以使用GsonBuilder并为诸如firstName或的字段名称添加ExclusionStrategycountry但是我似乎无法设法排除诸如的某些字段的属性country.name

使用该方法public boolean shouldSkipField(FieldAttributes fa),FieldAttributes包含的信息不足,无法使用过滤器将该字段匹配country.name

PS:我想避免使用注释,因为我想对此进行改进,并使用RegEx过滤掉字段。

编辑:我试图看看是否有可能模拟Struts2 JSON插件的行为

使用Gson

<interceptor-ref name="json">
  <param name="enableSMD">true</param>
  <param name="excludeProperties">
    login.password,
    studentList.*\.sin
  </param>
</interceptor-ref>

编辑: 我重新打开了以下添加的问题:

我添加了第二个具有相同类型的字段,以进一步阐明此问题。基本上我想排除country.name但不排除countrOfBirth.name。我也不想将“国家”作为一种类型排除在外。因此,类型与我要查明和排除的对象图中的实际位置相同。


问题答案:

因此,你要排除 firstNamecountry.name。这是你的ExclusionStrategy样子

    public class TestExclStrat implements ExclusionStrategy {

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

        public boolean shouldSkipField(FieldAttributes f) {

            return (f.getDeclaringClass() == Student.class && f.getName().equals("firstName"))||
            (f.getDeclaringClass() == Country.class && f.getName().equals("name"));
        }

    }

如果你仔细看它返回true的Student.firstNameCountry.name,这是要排除的东西。

你需要应用此ExclusionStrategy这样,

    Gson gson = new GsonBuilder()
        .setExclusionStrategies(new TestExclStrat())
        //.serializeNulls() <-- uncomment to serialize NULL fields as well
        .create();
    Student src = new Student();
    String json = gson.toJson(src);
    System.out.println(json);

返回:

{ "middleName": "J.", "initials": "P.F", "lastName": "Fry", "country": { "id": 91}}

我假设国家对象id = 91L在学生课堂中进行了初始化。

你可能会喜欢上。例如,你不想序列化名称中包含“ name”字符串的任何字段。做这个:

public boolean shouldSkipField(FieldAttributes f) {
    return f.getName().toLowerCase().contains("name"); 
}

这将返回:

{ "initials": "P.F", "country": { "id": 91 }}

编辑:根据要求添加了更多信息。

这样ExclusionStrategy就可以了,但是你需要传递“完全合格的字段名称”。见下文:

    public class TestExclStrat implements ExclusionStrategy {

        private Class<?> c;
        private String fieldName;
        public TestExclStrat(String fqfn) throws SecurityException, NoSuchFieldException, ClassNotFoundException
        {
            this.c = Class.forName(fqfn.substring(0, fqfn.lastIndexOf(".")));
            this.fieldName = fqfn.substring(fqfn.lastIndexOf(".")+1);
        }
        public boolean shouldSkipClass(Class<?> arg0) {
            return false;
        }

        public boolean shouldSkipField(FieldAttributes f) {

            return (f.getDeclaringClass() == c && f.getName().equals(fieldName));
        }

    }

这就是我们如何通用地使用它。

    Gson gson = new GsonBuilder()
        .setExclusionStrategies(new TestExclStrat("in.naishe.test.Country.name"))
        //.serializeNulls()
        .create();
    Student src = new Student();
    String json = gson.toJson(src);
    System.out.println(json); 

它返回:

{ "firstName": "Philip" , "middleName": "J.", "initials": "P.F", "lastName": "Fry", "country": { "id": 91 }}


 类似资料:
  • 主要内容:使用excludeFieldsWithModifiers()方法,使用@Expose注解默认情况下,GSON排除序列化/反序列化过程中的瞬态和静态字段。 我们来看看下面的例子。 示例 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 使用excludeFieldsWithModifiers()方法 GsonBuilder使用序列化/反序列化过程中的方法提供对使用特定修饰符排除字段的控制。 看下面的例子。 示例 创建一个名为的Java

  • 问题内容: 我有一个包含一些字段的Bean,并且其中两个不打算由hibernate模式映射(errorStatus和operationResultMessage)。我如何(通过注释)告诉Hibernate我不想映射这些字段? Bean中的映射表没有字段:errorStatus和operationResultMessage 提前致谢。 代码如下所示: **吸气剂和二传手被忽略! 问题答案: 使用注释

  • 所以我有 我读过Baeldung的文章和其他东西,但似乎我的选项是自定义类型(这是一个原始类型)或全局类型。如何实现这种自定义序列化?

  • 默认情况下,GSON从序列化/反序列化过程中排除瞬态和静态字段。 我们来看看下面的例子。 例子 (Example) 在C:\“GSON_WORKSPACE中创建名为GsonTester的Java类文件。 File: GsonTester.java import com.google.gson.Gson; import com.google.gson.GsonBuilder; public c

  • 本地环境设置 (Local Environment Setup) 如果您仍然愿意为Java编程语言设置环境,那么本节将指导您如何在计算机上下载和设置Java。 请按照下面提到的步骤设置环境。 Java SE可从链接Download Java免费获得。 因此,您下载基于您的操作系统的版本。 按照说明下载Java并运行.exe以在您的计算机上安装Java。 在计算机上安装Java后,需要设置环境变量以

  • 考虑一个案例,我有2个对象映射器实例。我希望必须从序列化中排除使用某些自定义注释注释的字段,而其他映射器包含(忽略注释) 就像类有3个字段a,b,c和c用一些注释注释(比如@IgnoreField)(它们的n个类,每个类都有它们不应该被序列化的字段) 现在,第一个对象映射器 o1 必须仅序列化 a 和 b。而第二个对象映射器o2可以序列化a,b和c。 任何具有不同字段的类都可能发生这种情况,其中一