Gson — 如何对 Null 值进行映射
在我们为数不多的 Gson 文章中,我们介绍了 Gson 是什么以及它如何将各种 JSON 数据结构映射到 Java 对象,反之亦然。 当然,还有很多问题没有得到解答。 在这篇文章中,我们将回答最有趣的问题之一。 如果想知道 Gson 如何处理 Null 值,请继续阅读下面的内容!
Null 会发生什么?
我们假设大家已经阅读了我们的第一篇 Gson 文章,其中介绍了 UserSimple
类及其字段。 在我们之前的演示中,始终设置所有值。 如果其中的一个字段的值为 null,会发生什么? 例如,我们正在创建一个用户,该用户具有 email、age 并且是开发人员,但 name 为空?
UserSimple userObject = new UserSimple(null, "jiyik_onmpw@163.com", 26, true);
这是有效的 Java 代码,会生成一个常规的 UserSimple
对象。 如果我们现在让 Gson 创建一个匹配的 JSON,它会是什么样子?
UserSimple userObject = new UserSimple(null, "jiyik_onmpw@163.com", 26, true);
Gson gson = new Gson();
String userJson = gson.toJson(userObject); // userJson = ??
Gson 将创建以下 JSON:
{
"age": 26,
"email": "jiyik_onmpw@163.com",
"isDeveloper": true
}
Gson 在序列化过程中只是忽略空值! 如果未设置值,则它根本不会成为结果 JSON 的一部分。 如果我们要求具有 null 值的字段也显示在 JSON 中(具有空值),Gson 有一个选项。 但我们稍后再看。
现在,重要的是您要了解在序列化期间,Gson 不会为空值创建 JSON 值。
反序列化的工作方式非常相似。 假设我们有以下 JSON,它没有了 email:
{
"age": 26,
"isDeveloper": true,
"name": "jiyik"
}
即使没有 email ,Gson 仍会尝试尽可能多地进行映射。 对于所有不存在的字段,它将保留 Java 对象值 null:
当然,如果字段是像String这样的可以为 null 的类型,设置为null很容易,但是如果不设置不可空类型呢? 例如,想象以下 JSON:
{
"email": "jiyik_onmpw@163.com",
"name": "jiyik"
}
age(作为 int 类型)和 isDeveloper(作为 boolean 类型)都不接受 null 值。 在这种情况下,Gson 仍然不会出错,只使用它们的默认值(分别为 0 和 false):
在这篇文章中,我们了解了 Gson 如何处理 null 值。 在未设置值时检查模型和业务逻辑是否存在可能的错误非常重要!
相关文章
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 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以