知識庫 / JSON RSS 訂閱

解決 Gson 解析錯誤

JSON
HongKong
10
09:47 PM · Dec 05 ,2025

1. 概述

在本教程中,我們將討論一些常見的 Gson 錯誤以及如何解決它們。

2. Gson 庫

Gson 是 Google 開發的 Java 庫,它允許將 Java 對象轉換為 JSON 以及反之。 它簡化了序列化和反序列化任務,並提供定製選項和高效的性能,用於處理複雜對象結構。

Gson 庫的最新版本可以在 Maven 中央倉庫 中找到。 讓我們將依賴項添加到我們的 pom.xml 中:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.11.0</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);

當運行此代碼時,我們得到以下 異常

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

實際上,無法將 JSONArray 解析為單個 Object。為了解決此錯誤,我們應該將其解析為數組或 Collection 替代方案。將解析為數組非常簡單:

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

然而,解析到 Collection 需要一些初步的工作。我們需要在解析前定義目標 Type

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 $

錯誤信息表明,我們應該將輸入解析為單個 Object

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

5. 結論

在本文中,我們學習了在使用 Gson 進行對象反序列化時常見的錯誤。 嘗試將數組與 Object 匹配,或者相反,總是會導致錯誤。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.