Gson – 排除或忽略字段

Gson – 排除或忽略字段

原文: 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 其他修饰符

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

例如,我们要排除一个类的所有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();

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

学习愉快!