原文: 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();
如果上述机制都不能满足我们的需求,那么我们始终可以使用自定义序列化器和反序列化器。
学习愉快!