Gson Builder — 如何使用 @Expose 忽略字段
在我们之前的文章中,我们一直假设想要(反)序列化模型的所有属性。 情况可能并非如此。 如果想自定义(反)序列化,请继续阅读下面的内容!
模型注解 @Expose
在阅读了上一篇关于 null 处理的文章 之后,大家可能会认为如果我们不希望它显示在 JSON 中,我们只需将 Java 对象字段设置为 null。 当我们不想通过网络传输私人或敏感数据时,这可能是必要的。 不用担心,Gson 使用注解 @Expose
提供了一个更简单的解决方案。
@Expose
是可选的,它提供了两个配置参数:serialize 和 deserialize 。 默认情况下,一切都设置为 true。 因此,如果我们不使用 @Expose
增强任何字段,就像我们在之前所做的那样,所有内容都将包括在内。 如果我们设置了 @Expose
,但没有将任一值专门设置为 false,它仍将被包含在内。
让我们重新访问 UserSimple
类并添加一些 @Expose
注解:
public class UserSimple {
@Expose()
String name; // 序列化和反序列化
@Expose(serialize = false, deserialize = false)
String email; // 既不序列化也不反序列化
@Expose(serialize = false)
int age; // 反序列化
@Expose(deserialize = false)
boolean isDeveloper; // 序列化
}
上面的示例将导致在序列化期间只有 name 和 isDeveloper 字段将显示在 JSON 中。 其他两个字段,即使已设置,也不会被转换。
在反序列化的另一个方向上,Java 对象将只有 name 和 age 字段的 JSON 值, email 和 isDeveloper 将被忽略。
默认的 Gson 实例不会考虑 @Expose
。 为了使用它,我们需要使用自定义 Gson 实例:
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
以下所有 gson 的使用都将考虑 @Expose
注解。
@Expose
是一种控制哪些值被(反)序列化的简单方法。 如果大家想要转换所有内容,我们建议不要使用 @Expose
。
下面我们看一下效果
String userJson = "{'age': 26, 'isDeveloper': true, 'email': 'zadmei_onmpw@163.com','name':'zadmei'}";
// 创建支持 Expose 注解的对象
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
这时的 userObject 对象的内容如下
transient
使用 @Expose
的另一种方法是将字段声明为transient。 transient字段也不会被(反)序列化。 但是,不像使用 @Expose
那样拥有完全控制权。 我们不能停用一个方向(序列化或反序列化),瞬态将始终完全关闭该属性的转换。
public class UserSimple {
String name;
String email;
int age;
boolean transient isDeveloper; // 不会被序列化和反序列化
}
在本篇内容中,我们将了解如何配置 @Expose
从而在(反)序列化期间排除和包含模型属性。 我们可能在日常工作中需要它,因此请务必正确理解它。