Gson:如何在不带批注的情况下从序列化中排除特定字段

2022-08-31 04:31:17

我正在尝试学习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并为字段名称添加一个Exclusionstrategy,例如或,但我似乎无法设法排除某些字段的属性,例如.firstNamecountrycountry.name

使用该方法,FieldAttributes 不包含足够的信息来匹配具有类似 过滤器的字段。public boolean shouldSkipField(FieldAttributes fa)country.name

P.S:我想避免注释,因为我想改进这一点,并使用正则表达式过滤掉字段。

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

使用格森

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

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

我添加了具有相同类型的第二个字段以进一步澄清此问题。基本上我想排除,但不是。我也不想将国家/地区排除为类型。因此,类型是相同的,它是我想要精确定位和排除的对象图中的实际位置。country.namecountrOfBirth.name


答案 1

任何你不希望序列化的字段通常都应该使用“瞬态”修饰符,这也适用于json序列化程序(至少它适用于我使用过的几个字段,包括gson)。

如果您不希望名称显示在序列化的json中,请给它一个瞬态关键字,例如:

private transient String name;

有关更多详细信息,请参阅 Gson 文档


答案 2

Nishant提供了一个很好的解决方案,但有一个更简单的方法。只需使用@Expose注释标记所需字段,例如:

@Expose private Long id;

省略任何不想序列化的字段。然后只需以这种方式创建您的Gson对象:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();