原文: https://howtodoinjava.com/gson/gson-exclude-or-ignore-fields/
Gson 允许我们从 Java 类中排除或忽略字段,这些字段不希望包含在序列化和反序列化中。 Gson 支持许多内置机制,用于排除顶级类,字段和字段类型。
@Expose标记要排除的对象的某些字段,默认为标记为,以考虑将序列化和反序列化为 JSON。 这意味着 Gson 将排除类中没有用@Expose注解标记的所有字段。
@Expose注解在一种编程风格中很有用,在该编程风格中,您要显式指定应考虑进行序列化或反序列化的所有字段。
@Expose是可选的,并提供两个配置参数:
serialize– 如果为真,则在序列化时会在 JSON 中写出带有此注解的字段。deserialize– 如果为真,则从 JSON 反序列化带有此注解的字段。
@Expose(serialize = false)
private String lastName;
@Expose (serialize = false, deserialize = false)
private String emailAddress;如果我们使用new Gson()创建 Gson 并执行toJson()和fromJson()方法,则@Expose将不会对序列化和反序列化产生任何影响。
要使用此注解,我们必须使用GsonBuilder类及其excludeFieldsWithoutExposeAnnotation()方法创建Gson实例。
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();默认情况下,如果我们仅将字段标记为瞬态,则 Gson 会将字段从序列化和反序列化中排除。 请记住,它无法阻止单向转换。 它同时阻止了两者。
transient将具有与@Expose (serialize = false, deserialize = false)相同的效果。
@Expose(serialize = false)
private String lastName;
private transient String emailAddress;通过使用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();如果以上任何一种技术都不适合我们,那么我们可以创建自己的策略。 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();如果上述机制都不能满足我们的需求,那么我们始终可以使用自定义序列化器和反序列化器。
学习愉快!