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': 'jiyik_onmpw@163.com','name':'jiyik'}";

// 创建支持 Expose 注解的对象
GsonBuilder builder = new GsonBuilder();
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();

UserSimple userObject = gson.fromJson(userJson, UserSimple.class);

这时的 userObject 对象的内容如下

Gson Builder — 如何使用 @Expose 忽略字段


transient

使用 @Expose 的另一种方法是将字段声明为transient。 transient字段也不会被(反)序列化。 但是,不像使用 @Expose 那样拥有完全控制权。 我们不能停用一个方向(序列化或反序列化),瞬态将始终完全关闭该属性的转换。

public class UserSimple {  
    String name;
    String email;
    int age;
    boolean transient isDeveloper; // 不会被序列化和反序列化
}

在本篇内容中,我们将了解如何配置 @Expose 从而在(反)序列化期间排除和包含模型属性。 我们可能在日常工作中需要它,因此请务必正确理解它。