Gson 教程展示了如何使用 Gson 库在 Java 中使用 JSON。 我们使用三种不同的 Gson API 来处理 JSON。 源代码可在作者的 Github 存储库中获得。
JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。 人类很容易读写,机器也很容易解析和生成。 与 XML 相比,它不那么冗长且更具可读性。 JSON 的官方 Internet 媒体类型为application/json
。 JSON 文件扩展名是.json
。 JSON 可直接由 JavaScript 使用。
Java Gson 库
Gson 是 Java 序列化/反序列化库,用于将 Java 对象转换为 JSON 并返回。 Gson 由 Google 创建,供内部使用,后来开源。
Java Gson Maven 依赖
这是对 Gson 的 Maven 依赖。
Java Gson 特性
这些是 Gson 特性:
- 用于 Java 对象 JSON 序列化和反序列化的简单工具。
- Java 泛型的广泛支持。
- 对象的自定义表示。
- 支持任意复杂的对象。
- 快速,低内存占用。
- 允许紧凑的输出和漂亮的打印。
Java Gson API
Gson 具有三种 API:
- 数据绑定 API
- 树模型 API
- 流 API
数据绑定 API 使用属性访问器将 JSON 与 POJO 之间进行转换。 Gson 使用数据类型适配器处理 JSON 数据。 它类似于 XML JAXB 解析器。
树模型 API 创建 JSON 文档的内存树表示。 它构建JsonElements
的树。 它类似于 XML DOM 解析器。
流 API 是一种低级 API,它使用JsonReader
和JsonWriter
作为离散记号读取和写入 JSON 内容。 这些类将数据读取为JsonTokens
。 该 API 具有最低的开销,并且在读/写操作中速度很快。 它类似于 XML 的 Stax 解析器。
Java Gson 类
Gson
是使用 Gson 库的主要类。 有两种创建Gson
的基本方法:
- 新 Gson()
- 新的 GsonBuilder()。create()
GsonBuilder
可用于使用各种配置设置来构建 Gson。
Java Gson toJson()
toJson()
方法将指定的对象序列化为其等效的 JSON 表示形式。
GsonToJson.java
在示例中,我们使用toJSon()
方法将映射序列化为 JSON。
这是示例的输出。
Java Gson fromJson()
fromJson()
方法将指定的 JSON 反序列化为指定类的对象。
GsonFromJson.java
该示例使用fromJson()
方法将 JSON 读取到 Java 对象中。
注意,没有必要使用 getter 和 setter 方法。
This is the output of the example.
GsonBuilder
GsonBuilder
使用各种配置设置构建 Gson。 GsonBuilder
遵循构建器模式,通常通过首先调用各种配置方法来设置所需的选项,最后调用create()
来使用它。
GsonBuilderEx.java
在示例中,我们将对象写入 JSON。 我们使用GsonBuilder
创建Gson
。
我们使用GsonBuilder
创建并配置 Gson。 字段命名策略设置为FieldNamingPolicy.UPPER_CAMEL_CASE
。
这是输出。
Java Gson 漂亮打印
Gson 有两种输出模式:紧凑和漂亮。
GsonPrettyPrinting.java
该示例漂亮地显示了 JSON 输出。
setPrettyPrinting()
方法设置漂亮的打印模式。
This is the output of the example.
序列化空值
默认情况下,Gson 不会将具有空值的字段序列化为 JSON。 如果 Java 对象中的字段为null
,则 Gson 会将其排除。 我们可以使用serializeNulls()
方法强制 Gson 通过 GsonBuilder 序列化null
值。
GsonSerializeNulls.java
该示例显示了如何序列化null
值。
This is the output.
Java Gson 写入列表
以下示例将 JSON 对象列表写入文件。
GsonWriteList.java
该示例将 JSON 数据写入items.json
文件。
Java Gson 读入数组
下一个示例将数据读取到 Java 数组中。
这些是users.json
文件的内容。
GsonReadArray.java
该示例将items.json
文件中的数据读取到数组中。 我们将数组的内容打印到控制台。
fromJson()
的第二个参数是数组类。
Java Gson 从 URL 读取 JSON
以下示例从网页读取 JSON 数据。 我们从http://time.jsontest.com
获得 JSON 数据。
GET 请求返回此 JSON 字符串。
GsonReadWebPage.java
该代码示例从http://time.jsontest.com
读取 JSON 数据。
This is the output.
Java Gson 使用@Expose
排除字段
@Expose
注解指示应公开成员以进行 JSON 序列化或反序列化。 @Expose
注解可以采用两个布尔参数:serialize
和deserialize
。 必须使用excludeFieldsWithoutExposeAnnotation()
方法显式启用@Expose
注解。
GsonExcludeFields.java
在示例中,我们从序列化中排除一个字段。
婚姻状况字段不会被序列化,因为它没有用@Expose
注解修饰。
@Expose
注解通过excludeFieldsWithoutExposeAnnotation()
方法启用了字段排除。
This is the output.
Java Gson 数据绑定 API
数据绑定 API 使用属性访问器在 POJO 与 JSON 之间进行转换。 Gson 使用数据类型适配器处理 JSON 数据。
Gson 数据绑定 API 编写
在下面的示例中,我们使用数据绑定 API 编写数据。
GsonDataBindApiWrite.java
在示例中,我们创建了一个汽车对象列表,并使用 Gson 数据绑定 API 对其进行了序列化。
我们将cars
列表传递给toJson()
方法。 Gson 自动将汽车对象映射到 JSON。
读取 Gson 数据绑定 API
在下面的示例中,我们使用数据绑定 API 读取数据。
GsonDataBindingApiRead.java
在示例中,我们使用 Gson 数据绑定 API 将数据从 JSON 文件读取到汽车对象列表中。
Gson 自动将 JSON 映射到Car
对象。 由于类型信息在运行时会丢失,因此我们需要使用TypeToken
让 Gson 知道我们使用的是哪种类型。
Java Gson 树模型 API
树模型 API 在内存中创建 JSON 文档的树表示。 它构建JsonElements
的树。 JsonElement
是代表 Json 元素的类。 它可以是JsonObject
,JsonArray
,JsonPrimitive
或JsonNull
。
Gson 树模型写
在以下示例中,我们使用 Gson 树模型 API 将 Java 对象写入 JSON。
GsonTreeModelWrite.java
汽车对象列表被序列化为 JSON 格式。
toJsonTree
方法将指定的对象序列化为其等效表示形式,作为JsonElements
的树。
我们使用getAsJsonArray()
方法将树转换为JsonArray
。
我们从数组中获取第二个元素。
我们修改一个属性。
最后,我们将树对象写入文件中。
Gson 树模型读取
在以下示例中,我们使用 Gson 树模型 API 从 JSON 读取 Java 对象。
cars.json
这是cars.json
文件中的 JSON 数据。
GsonTreeModelRead.java
在示例中,我们将 JSON 数据从文件读取到JsonElements
树中。
JsonParser
将 JSON 解析为JsonElements
的树结构。
我们将树作为JsonArray
。
我们浏览JsonArray
并打印其元素的内容。
Java Gson 流 API
Gson 流 API 是一个低级 API,它以离散记号(JsonTokens
)的形式读取和写入 JSON。 主要类别是JsonReader
和JsonWriter
。 JsonToken
是 JSON 编码的字符串中的结构,名称或值类型。
这些是JsonToken
类型:
- BEGIN_ARRAY —打开 JSON 数组
- END_ARRAY —关闭 JSON 数组
- BEGIN_OBJECT —打开 JSON 对象
- END_OBJECT —关闭 JSON 对象
- NAME-JSON 属性名称
- STRING — JSON 字符串
- NUMBER — JSON 数字(双精度,长整型或整型)
- BOOLEAN — JSON 布尔值
- NULL — JSON 空值
- END_DOCUMENT — JSON 流的末尾。
JsonWriter
JsonWriter
将 JSON 编码值写入流,一次写入一个记号。 流包含文字值(字符串,数字,布尔值和 null)以及对象和数组的开始和结束定界符。 每个 JSON 文档必须包含一个顶级数组或对象。
使用beginObject()
和endObject()
方法调用创建对象。 在对象内,标记在名称及其值之间交替。 在beginArray()
和endArray()
方法调用中创建数组。
GsonStreamApiWrite.java
在示例中,我们将一个汽车对象写入 JSON 文件。
创建一个新的JsonWriter
。
如上所述,每个 JSON 文档必须具有一个顶级数组或对象。 在我们的例子中,我们有一个顶级对象。
我们将键值对写入文档。
在这里,我们创建一个数组。
JsonReader
JsonReader
读取 JSON 编码值作为记号流。
GsonStreamApiRead.java
该示例使用JsonReader
从 JSON 字符串读取数据。
JsonReader
对象已创建。 它从 JSON 字符串读取。
在while
循环中,我们迭代流中的记号。
我们使用peek()
方法获得下一个标记的类型。
beginObject()
方法使用 JSON 流中的下一个记号,并断言它是新对象的开始。
nextName()
方法返回下一个JsonToken
并使用它。
我们获取下一个字符串值并将其打印到控制台。
在本教程中,我们展示了如何通过 Gson 库使用 JSON。