Gson -- Java-JSON 序列化和反序列化入门
Gson 是一个非常强大的库,可以将表示为 JSON 的数据结构映射到 Java 对象。 当然,它也支持相反的方式,可以为我们的 Java 对象创建适当的 JSON 表示。
Gson 依赖
本篇文章将从实例着手,并在马上开始一些序列化。 Gson 可以在任何 Java 环境中使用。 在开始之前,我们需要将 Gson 库拉入我们的项目。 在撰写本文时,最新版本是 2.8.5。 如果大家使用的是 Gradle,需要添加以下依赖项:
implementation 'com.google.code.gson:gson:2.8.5'
如果使用的是 Maven,可以将下面代码添加到 pom.xml 配置文件中
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
<scope>compile</scope>
</dependency>
</dependencies>
对于既不使用依赖管理系统的开发人员,可以在官方 GitHub 仓库上下载该 jar 包 - https://github.com/google/gson。
Java-JSON 序列化基础
所以让我们做一些序列化! Gson 上下文中的序列化意味着将 Java 对象映射到其 JSON 表示。 在接下来的内容中,我们的数据将变得更加复杂,但现在我们将从一个非常简单的 UserSimple
对象开始:
public class UserSimple {
String name;
String email;
int age;
boolean isDeveloper;
}
用户对象有四个属性:
- name 是一个 String 对象
- email 也是一个String对象
- age 是一个整数,这意味着年龄以年为单位存储(例如 26 而不是确切的生日!)
- isDeveloper 最后一个布尔标志
我们的 Android 或 Java 应用程序需要将 UserSimple 对象转换为其 JSON 表示。 假设我们保持成员名称相同,我们希望 jiyik 有这样的 JSON:
{
"name": "jiyik",
"email": "jiyik_onmpw@163.com",
"age": 26,
"isDeveloper": true
}
那么让我们看看如何使用 Gson 进行转换。 首先,我们需要为 jiyik 创建一个 Java 对象:
UserSimple userObject = new UserSimple(
"jiyik",
"jiyik_onmpw@163.com",
26,
true
);
为了进行序列化,我们需要一个 Gson 对象来处理转换。 我们可以简单地使用构造函数:
Gson gson = new Gson();
接下来,我们需要调用函数 toJson()
并传递 UserSimple 对象:
String userJson = gson.toJson(userObject);
userJson
对象包含以下值:
{
"age": 26,
"email": "jiyik_onmpw@163.com",
"isDeveloper": true,
"name": "jiyik"
}
Gson 更改了属性的顺序(按字母顺序),但内容相同! 请注意 Gson 如何保持这些类型不变的。 字符串值被包裹在 "" 中,而整数值没有包裹。 我们不必弄乱 JSON 对象或复制单个成员。 一次调用 Gson 就足以映射整个对象。 当我们处理复杂的数据结构时,这非常方便。 但在深入之前,让我们测试另一个方向。 Gson 可以从上面的 JSON 中创建一个 Java 对象吗?
JSON-Java 反序列化基础
首先,我们需要创建一个String,其中包含上面提到的JSON:
String userJson = "{'age':26,'email':'jiyik_onmpw@163.com','isDeveloper':true,'name':'jiyik'}";
我们将双引号 "
更改为单引号 '
以避免大量的 \"
转义。 然而,无论哪种方式,它都有效。 正如大家可能已经猜到的,下一步是创建一个 Gson 实例:
Gson gson = new Gson();
最后,我们必须使用 fromJson()
从 JSON 映射到 Java 对象:
UserSimple userObject = gson.fromJson(userJson, UserSimple.class);
请注意我们如何将预期的 Java 对象作为第二个参数传递给函数 fromJSON()
。 否则 Gson 不知道它应该将 JSON 映射到什么。 它不是魔术师!
如果我们附加一个调试器并检查生成的 userObject
,它会告诉我们 Gson 成功地正确映射了所有属性:
总结
在这篇入门文章中,我们已经了解了 Gson 的基本用法。 我们已经展示了从 JSON 数据映射到 JSON 数据是多么容易。 目前大家可能有很多问题:
- Java 模型类是否需要构造函数/getter/setter?
- Java 模型字段可以是私有的吗?
- 如何处理空值?
- 如果 Java 类的成员命名与 JSON 不同怎么办?
- 如何(反)序列化对象的数组/列表
- 如何(反)序列化嵌套对象
- Gson 在执行 .fromJson() 时是否为类属性保留定义的默认值,并且 JSON 中没有该属性的任何值?
不用担心,我们将在接下来的一段时间内解决所有问题。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
相关文章
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 格式的对象列表。 到目前为止,这没有什么不寻常的,也不是问题。 然而,问题是对象是多态的,需要解析子类特定的字段。 以