原文: 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 反序列化带有此注解的字段。
@Expose(serialize = false)private String lastName;@Expose (serialize = false, deserialize = false)private String emailAddress;
1.2 创建 Gson 实例
如果我们使用new Gson()创建 Gson 并执行toJson()和fromJson()方法,则@Expose将不会对序列化和反序列化产生任何影响。
要使用此注解,我们必须使用GsonBuilder类及其excludeFieldsWithoutExposeAnnotation()方法创建Gson实例。
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
2.排除带有修饰符的字段
2.1 瞬态字段
默认情况下,如果我们仅将字段标记为瞬态,则 Gson 会将字段从序列化和反序列化中排除。 请记住,它无法阻止单向转换。 它同时阻止了两者。
transient将具有与@Expose (serialize = false, deserialize = false)相同的效果。
@Expose(serialize = false)private String lastName;private transient String emailAddress;
2.2 其他修饰符
通过使用GsonBuilder的excludeFieldsWithModifiers()方法,我们可以排除具有某些公开修饰符的字段。
例如,我们要排除一个类的所有static成员,我们可以这样创建 Gson 对象:
Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.STATIC).create();
我们可以在“excludeFieldsWithModifiers”方法中使用任意数量的Modifier常量。 例如:
Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.STATIC,Modifier.TRANSIENT,Modifier.VOLATILE).create();
3.排除策略
如果以上任何一种技术都不适合我们,那么我们可以创建自己的策略。 ExclusionStrategy用于确定是否应序列化或反序列化字段或顶级类作为 JSON 输出/输入的一部分。
- 对于序列化,如果
shouldSkipClass(Class)或shouldSkipField(fieldAttributes)方法返回true,则该类或字段类型将不属于 JSON。 输出。 - 对于反序列化,如果
shouldSkipClass(Class)或shouldSkipField(fieldAttributes)方法返回true,则不会将其设置为 Java 对象结构的一部分 。
例如,在ExclusionStrategy定义下方将排除所有带有@Hidden注解的字段。
//public @interface Hidden {// some implementation here//}// Excludes any field (or class) that is tagged with an "@Hidden"public class HiddenAnnotationExclusionStrategy implements ExclusionStrategy{public boolean shouldSkipClass(Class<?> clazz) {return clazz.getAnnotation(Hidden.class) != null;}public boolean shouldSkipField(FieldAttributes f) {return f.getAnnotation(Hidden.class) != null;}}
要使用该排除策略,请在GsonBuilder对象中进行设置。
GsonBuilder builder = new GsonBuilder();builder.setExclusionStrategies( new HiddenAnnotationExclusionStrategy() );Gson gson = builder.create();
如果上述机制都不能满足我们的需求,那么我们始终可以使用自定义序列化器和反序列化器。
学习愉快!
