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
}現在我們來考慮一個包含兩名名為 James 和 John 的 JSONArray 的數據:
[
{
"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. 在預期數組時獲取對象
另一方面,現在讓我們定義一個名為 John 的 Person 對象:
{
"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 匹配,或者相反,總是會導致錯誤。