企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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(); ``` 如果上述机制都不能满足我们的需求,那么我们始终可以使用*自定义序列化器和反序列化器*。 学习愉快!