Gson - 集合 Sets 的映射
在上两篇文章中,我们介绍了如何使用 Gson 映射列表数据 和 Java Map 映射。 在这篇文章中,我们将学习如何(反)序列化 Java 集合。
Java 集合的序列化
Java 集合框架包含各种数据结构。 我们已经查看了列表和Map,它们的 JSON 表示形式存在一些差异。 这里,我们将看看集合(Sets)。 例如,HashSet
是确保数据收集唯一性的好方法。 由于集合的存在是有原因的并且在现实世界中使用,Gson 也需要能够处理它们。
因此,让我们通过一个动手的场景。 我们的应用程序具有多个用户可以作为一个组加入的功能。 当然,每个用户只能加入一次,所以我们使用 HashSet
来存储用户名。
如果我们在 Java 中实现它,我们将有下面的代码:
HashSet<String> users = new HashSet<>();
users.add("Christian");
users.add("Marcus");
users.add("Norman");
users.add("Marcus"); // 不会再添加
集合的序列化与任何其他类型相同。 我们可以把它扔给 Gson,它会做正确的事情:
Gson gson = new Gson();
String usersJson = gson.toJson(users);
生成的JSON如下所示
[
"Marcus",
"Christian",
"Norman"
]
如大家所见,集合的 JSON 表示与列表的表示相同。 是的,Java 在内部对它们的处理方式完全不同,但在高层次上,它们都存储相同的数据。 对于像 JSON 这样的与实现无关的表示法,内部细节无关紧要。
Java 集合的反序列化
正如我们上面提到的,列表和集合的 JSON 表示是相同的。 因此,Gson 很乐意将有效的 JSON 反序列化为任何一种 Java 数据类型。 还记得列表/数组文章中的 flowerCount
示例吗? 由于我们可以将 JSON 用于任何一个,让我们来看看它:
[
{
"name": "Christian",
"flowerCount": 1
},
{
"name": "Marcus",
"flowerCount": 3
},
{
"name": "Norman",
"flowerCount": 2
}
]
我们处理集合序列化的方式与处理列表的方式相同。 我们为 Gson 创建一个 Type
,然后让它发挥它的魔力:
String founderJson = "[{'name': 'Christian','flowerCount': 1}, {'name': 'Marcus', 'flowerCount': 3}, {'name': 'Norman', 'flowerCount': 2}]";
Gson gson = new Gson();
Type founderSetType = new TypeToken<HashSet<Founder>>(){}.getType();
HashSet<Founder> founderSet = gson.fromJson(founderJson, founderSetType);
founderSet
变量实际上保存的内容与上一篇文章中的列表相同,只是数据类型不同:
在这篇文章中,我们了解了如何从 JSON 序列化和反序列化 Java 集合。 我们已经了解到,在 JSON 上下文中,它们与列表没有什么不同。 现在我们已经探索了所有主要的数据类型,接下来将研究一些通用的 Gson 配置选项。
相关文章
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 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以