# Gson – 排除或忽略字段

> 原文： [https://howtodoinjava.com/gson/gson-exclude-or-ignore-fields/](https://howtodoinjava.com/gson/gson-exclude-or-ignore-fields/)

[Gson](https://howtodoinjava.com/learningpaths/gson/) 允许我们从 Java 类中排除或忽略字段，这些字段不希望包含在序列化和反序列化中。 Gson 支持许多内置机制，用于排除顶级类，字段和字段类型。

## 1\. Gson `@Expose`批注

[`@Expose`](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/annotations/Expose.html)标记要排除的对象的某些字段，默认为*标记为*，以考虑将序列化和反序列化为 JSON。 这意味着 Gson 将排除类中没有用`@Expose`批注标记的所有字段。

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

#### 1.1 如何使用`@Expose`

`@Expose`是可选的，并提供两个配置参数：

*   `serialize` – 如果*为真*，则在序列化时会在 JSON 中写出带有此批注的字段。
*   `deserialize` – 如果*为真*，则从 JSON 反序列化带有此批注的字段。

```java
@Expose(serialize = false) 
private String lastName;

@Expose (serialize = false, deserialize = false) 
private String emailAddress;

```

#### 1.2 创建 Gson 实例

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

要使用此注释，我们必须使用[`GsonBuilder`](https://howtodoinjava.com/gson/gson-gsonbuilder-configuration/)类及其`excludeFieldsWithoutExposeAnnotation()`方法创建`Gson`实例。

```java
Gson gson = new GsonBuilder()
		.excludeFieldsWithoutExposeAnnotation()
		.create();

```

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

#### 2.1 瞬态字段

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

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

```java
@Expose(serialize = false) 
private String lastName;

private transient String emailAddress;

```

#### 2.2 其他修饰符

通过使用`GsonBuilder`的`excludeFieldsWithModifiers()`方法，我们可以排除具有某些公共修饰符的字段。

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

```java
Gson gson = new GsonBuilder()
		.excludeFieldsWithModifiers(Modifier.STATIC)
		.create();

```

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

```java
Gson gson = new GsonBuilder()
		.excludeFieldsWithModifiers(Modifier.STATIC, 
							Modifier.TRANSIENT, 
							Modifier.VOLATILE)
		.create();

```

## 3.排除策略

如果以上任何一种技术都不适合我们，那么我们可以创建自己的策略。 [`ExclusionStrategy`](https://static.javadoc.io/com.google.code.gson/gson/2.8.5/com/google/gson/ExclusionStrategy.html)用于确定是否应序列化或反序列化字段或顶级类作为 JSON 输出/输入的一部分。

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

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

```java
//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`对象中进行设置。

```java
GsonBuilder builder = new GsonBuilder();
builder.setExclusionStrategies( new HiddenAnnotationExclusionStrategy() );

Gson gson = builder.create();

```

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

学习愉快！