原文: https://howtodoinjava.com/gson/gson-exclude-or-ignore-fields/

Gson 允许我们从 Java 类中排除或忽略字段,这些字段不希望包含在序列化和反序列化中。 Gson 支持许多内置机制,用于排除顶级类,字段和字段类型。

1. Gson @Expose注解

@Expose标记要排除的对象的某些字段,默认为标记为,以考虑将序列化和反序列化为 JSON。 这意味着 Gson 将排除类中没有用@Expose注解标记的所有字段。

@Expose注解在一种编程风格中很有用,在该编程风格中,您要显式指定应考虑进行序列化或反序列化的所有字段。

1.1 如何使用@Expose

@Expose是可选的,并提供两个配置参数:

  • serialize – 如果为真,则在序列化时会在 JSON 中写出带有此注解的字段。
  • deserialize – 如果为真,则从 JSON 反序列化带有此注解的字段。
  1. @Expose(serialize = false)
  2. private String lastName;
  3. @Expose (serialize = false, deserialize = false)
  4. private String emailAddress;

1.2 创建 Gson 实例

如果我们使用new Gson()创建 Gson 并执行toJson()fromJson()方法,则@Expose将不会对序列化和反序列化产生任何影响。

要使用此注解,我们必须使用GsonBuilder类及其excludeFieldsWithoutExposeAnnotation()方法创建Gson实例。

  1. Gson gson = new GsonBuilder()
  2. .excludeFieldsWithoutExposeAnnotation()
  3. .create();

2.排除带有修饰符的字段

2.1 瞬态字段

默认情况下,如果我们仅将字段标记为瞬态,则 Gson 会将字段从序列化和反序列化中排除。 请记住,它无法阻止单向转换。 它同时阻止了两者。

transient将具有与@Expose (serialize = false, deserialize = false)相同的效果。

  1. @Expose(serialize = false)
  2. private String lastName;
  3. private transient String emailAddress;

2.2 其他修饰符

通过使用GsonBuilderexcludeFieldsWithModifiers()方法,我们可以排除具有某些公开修饰符的字段。

例如,我们要排除一个类的所有static成员,我们可以这样创建 Gson 对象:

  1. Gson gson = new GsonBuilder()
  2. .excludeFieldsWithModifiers(Modifier.STATIC)
  3. .create();

我们可以在“excludeFieldsWithModifiers”方法中使用任意数量的Modifier常量。 例如:

  1. Gson gson = new GsonBuilder()
  2. .excludeFieldsWithModifiers(Modifier.STATIC,
  3. Modifier.TRANSIENT,
  4. Modifier.VOLATILE)
  5. .create();

3.排除策略

如果以上任何一种技术都不适合我们,那么我们可以创建自己的策略。 ExclusionStrategy用于确定是否应序列化或反序列化字段或顶级类作为 JSON 输出/输入的一部分。

  • 对于序列化,如果shouldSkipClass(Class)shouldSkipField(fieldAttributes)方法返回true,则该类或字段类型将不属于 JSON。 输出。
  • 对于反序列化,如果shouldSkipClass(Class)shouldSkipField(fieldAttributes)方法返回true,则不会将其设置为 Java 对象结构的一部分 。

例如,在ExclusionStrategy定义下方将排除所有带有@Hidden注解的字段。

  1. //public @interface Hidden {
  2. // some implementation here
  3. //}
  4. // Excludes any field (or class) that is tagged with an "@Hidden"
  5. public class HiddenAnnotationExclusionStrategy implements ExclusionStrategy
  6. {
  7. public boolean shouldSkipClass(Class<?> clazz) {
  8. return clazz.getAnnotation(Hidden.class) != null;
  9. }
  10. public boolean shouldSkipField(FieldAttributes f) {
  11. return f.getAnnotation(Hidden.class) != null;
  12. }
  13. }

要使用该排除策略,请在GsonBuilder对象中进行设置。

  1. GsonBuilder builder = new GsonBuilder();
  2. builder.setExclusionStrategies( new HiddenAnnotationExclusionStrategy() );
  3. Gson gson = builder.create();

如果上述机制都不能满足我们的需求,那么我们始终可以使用自定义序列化器和反序列化器

学习愉快!