1. 概述

在这个教程中,我们将讨论一些常见的Gson错误及其解决方法。

2. Gson 库

Gson 是由 Google 开发的 Java 库,它允许将Java 对象转换为JSON,反之亦然。 它简化了序列化(/java-serialization)和反序列化任务,提供了定制选项和处理复杂对象结构时的高效性能。

Gson 库的最新版本可以在Maven 中央仓库找到。让我们在 pom.xml 文件中添加依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

3. 将数组误认为对象

首先,我们定义一个简单的 Person 类,只有一个 name 属性:

public class Person {

    public String name;

    // standard constructor and getter

}

现在考虑一个包含两个名为 JamesJohnJSONArray

[
  {
    "name": "John"
  },
  {
    "name": "James"
  }
]

如果我们不小心将这个 JSONArray 解析为一个简单的 Person 对象,会怎么做呢?通过以下指令:

Person person = new Gson().fromJson("[{\"name\":\"John\"},{\"name\":\"James\"}]", Person.class);

运行这段代码时,我们会遇到如下 Exception

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

的确,不可能将一个 JSONArray 解析为一个单独的对象。要修复这个错误,*我们应该将其解析为一个数组或一个集合***。解析成数组非常直接:

Person[] personArray = new Gson().fromJson("[{\"name\":\"John\"},{\"name\":\"James\"}]", Person[].class)

然而,解析到一个集合需要一些前期工作。我们需要提前定义目标类型:

Type collectionType = new TypeToken<Collection<Person>>() {}.getType();
Collection<Person> personCollection = new Gson().fromJson("[{\"name\":\"John\"},{\"name\":\"James\"}]", collectionType);

4. 将对象误认为数组

另一方面,我们定义一个名为 JohnPerson

{
  "name": "John"
}

现在尝试将这个 JSONObject 解析为 Java 数组:

Person[] personArray = new Gson().fromJson("{\"name\":\"John\"}", Person[].class);

这段代码会抛出一个 JsonSyntaxException

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

错误消息提示我们应该将输入解析为一个单独的对象

Person person = new Gson().fromJson("{\"name\":\"John\"}", Person.class);

5. 总结

在这篇文章中,我们了解了在使用 Gson 进行对象反序列化时常见的错误。试图将数组与对象匹配错误,或者相反,总是会导致错误。

如往常一样,示例代码的源代码可以在GitHub上获取。


原始标题:Solving Gson Parsing Errors | Baeldung