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 -- Java-JSON 序列化和反序列化入门


总结

在这篇入门文章中,我们已经了解了 Gson 的基本用法。 我们已经展示了从 JSON 数据映射到 JSON 数据是多么容易。 目前大家可能有很多问题:

  • Java 模型类是否需要构造函数/getter/setter?
  • Java 模型字段可以是私有的吗?
  • 如何处理空值?
  • 如果 Java 类的成员命名与 JSON 不同怎么办?
  • 如何(反)序列化对象的数组/列表
  • 如何(反)序列化嵌套对象
  • Gson 在执行 .fromJson() 时是否为类属性保留定义的默认值,并且 JSON 中没有该属性的任何值?

不用担心,我们将在接下来的一段时间内解决所有问题。