Gson 对 Map 结构进行映射
我们将在本篇文章中探讨如何使用 Java Map。 我们将学习如何使用 Gson 库(反)序列化 Java Map。
Java Map 的序列化
Java Map是一种非常灵活的数据类型,可用于各种场景。 它使我们的开发人员能够在 Java 编程语言中实现许多现实世界的情况。 由于 Java Map的使用范围如此之广,因此我们可能不会涵盖确切的用例,但该方法适用于所有这些用例。
让我们从应用具有员工姓名列表的场景开始。 我们被要求实施一个视图以显示以特定首字母开头的所有员工。 例如,用户可以选择字母 A,我们的应用程序将返回三个匹配的员工 Andreas、Aden 和 Arnold。 第一次迭代只是一个包含所有名称的列表,但性能还不够好。 因此,实现被切换到 HashMap
,其中键是第一个字母(即 A),值是名称列表。
如果我们创建我们的 HashMap
,我们的 Java 代码将如下所示:
HashMap<String, List<String>> employees = new HashMap<>();
employees.put("A", Arrays.asList("Andreas", "Arnold", "Aden"));
employees.put("C", Arrays.asList("Christian", "Carter"));
employees.put("M", Arrays.asList("Marcus", "Mary"));
Map 的序列化与任何其他类型相同。 我们可以把它扔给 Gson,它会做正确的事情:
Gson gson = new Gson();
String employeeJson = gson.toJson(employees);
这将会生成如下的JSON
{
"M": [
"Marcus",
"Mary"
],
"C": [
"Christian",
"Carter"
],
"A": [
"Andreas",
"Arnold",
"Aden"
]
}
每个键(A、C 和 M)都有一个名称列表,这正是我们想要描述的。
Java Map 的反序列化
如果我们查看上一节的结果 JSON 或下面的 JSON,则会问自己:如何发现集合和多个对象之间的区别? 简单的答案是:你不能。 这是 JSON 数据表示不明确的少数情况之一。 让我们看下面的例子:
{
"1$": {
"amount": 1,
"currency": "Dollar"
},
"2$": {
"amount": 2,
"currency": "Dollar"
},
"3€": {
"amount": 3,
"currency": "Euro"
}
}
这是 JSON,大家可以假设存在三个名称为 1$ 、2$ 和 3€ 的对象。 这些对象中的每一个都有一些值。 但另一方面,它也可以是一个简单的 Map,其中 1$ 、2$ 和 3€ 是键。
没有万无一失的方法来评估 JSON 是什么数据类型。 一些可以帮助大家的建议是:
- 首先也是最重要的:上下文知识! 如果有文档或知道对象所描述的内容,我们应该能够解释是否存在单独的对象或数据映射。
- 值的数据类型是否一致? 然后它向 Map 提示。
- 对象名称/键是否动态且范围广泛?
- 我们已经在之前的文章中向大家展示了如何映射常规对象,因此在本篇文章中,我们将假设 JSON 是数据映射。 我们如何将上面显示的 JSON 映射到 Java 对象?
我们可以使用我们在 List of Objects 文章中向大家展示的相同 TypeToken 方法。 我们可以通过使用我们预期的数据类型创建一个新的 TypeToken 来创建一个适当的类型:
public class AmountWithCurrency {
String currency;
int amount;
}
String dollarJson = "{ '1$': { 'amount': 1, 'currency': 'Dollar'}, '2$': { 'amount': 2, 'currency': 'Dollar'}, '3€': { 'amount': 3, 'currency': 'Euro'} }";
Gson gson = new Gson();
Type amountCurrencyType =
new TypeToken<HashMap<String, AmountWithCurrency>>(){}.getType();
HashMap<String, AmountWithCurrency> amountCurrency =
gson.fromJson(dollarJson, amountCurrencyType);
amountCurrency
变量实际上保存了具有正确键和值的完整集合:
Map 数据结构不必是 模型/JSON 的根元素。 它可以只是一个对象的属性。 我们可以像使用列表一样(反)序列化它。 我们已经在这里发布了嵌套对象映射指南。
在这篇文章中,我们已经了解了如何从 JSON 序列化和反序列化 Java Map。 我们已经了解了潜在的障碍以及如何克服它们。 在下一篇文章中,我们将介绍非常相似的 Java 数据类型 Sets 的映射。
相关文章
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 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以