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 对象的内容如下
transient
使用 @Expose
的另一种方法是将字段声明为transient。 transient字段也不会被(反)序列化。 但是,不像使用 @Expose
那样拥有完全控制权。 我们不能停用一个方向(序列化或反序列化),瞬态将始终完全关闭该属性的转换。
public class UserSimple {
String name;
String email;
int age;
boolean transient isDeveloper; // 不会被序列化和反序列化
}
在本篇内容中,我们将了解如何配置 @Expose
从而在(反)序列化期间排除和包含模型属性。 我们可能在日常工作中需要它,因此请务必正确理解它。
相关文章
Gson 通过@JsonAdapter 自定义(反)序列化
发布时间:2022/07/24 浏览次数:217 分类:编程语言
-
在这篇文章中,我们将展示如何简化(反)序列化的自定义。 所有这些选项都只能通过自定义 Gson 实例和一些样板代码获得。 Gson 2.7 引入了一个简单的注解,我们可以节省大量代码并获
Gson 自定义反序列化基础
发布时间:2022/07/21 浏览次数:81 分类:编程语言
-
在这篇文章中,我们将了解如何实现自定义 Gson 反序列化。 如果服务器以与客户端的应用程序数据模型不匹配的格式向我们发送数据,请继续阅读!
Gson 自定义实例创建器
发布时间:2022/07/14 浏览次数:121 分类:编程语言
-
在这篇文章中,我们将讨论自定义反序列化的另一个组件。 在过去的几篇文章中,我们探讨了如何自定义数据的序列化和反序列化。 在这两种情况下,我们都试图减轻服务器和客户端之
Gson 循环引用的映射
发布时间:2022/07/13 浏览次数:173 分类:编程语言
-
在这篇文章中,我们将讨论一个特别讨厌的话题:循环引用。 我们可能在计算机科学或图表数学课上听说过循环引用。 在更实际的解释中:它处理对象具有指向不同对象的嵌套属性的情
Gson Builder Floats 和 Doubles 的特殊值
发布时间:2022/07/12 浏览次数:193 分类:编程语言
-
在上一篇 Gson 的文章中,我们研究了使 JSON 转换降低标准的选项。 Lenient 允许传入的 JSON 在某种程度上是非标准的,Gson 仍然能够将其解析为 Java 对象。 在这篇文章中,我们将研究一个
Gson 自定义序列化
发布时间:2022/07/11 浏览次数:117 分类:编程语言
-
在这篇文章中,我们将探讨如何自定义 Java 对象的 Gson 序列化。 我们可能想要更改序列化的原因有很多,例如 简化我们的模型以减少发送的数据量或删除个人信息。 现在我们将通过实
Gson 映射 Enum 枚举
发布时间:2022/07/10 浏览次数:156 分类:编程语言
-
在之前的文章中我们介绍了如何映射嵌套对象、数组和列表、Java Map 等。 在这篇文章中,您将学习如何(反)序列化 Java 枚举 Enum。
Gson 如何反序列化多态对象列表
发布时间:2022/07/09 浏览次数:286 分类:编程语言
-
最近,我们遇到了一种情况,我从 REST 端点接收到 JSON 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以