解決Gson解析錯誤
瀏覽人數:151最近更新:
一、概述
在本教程中,我們將討論一些常見的 Gson 錯誤以及如何修復它們。
2. Gson庫
Gson 是由 Google 開發的一個 Java 庫,它允許將 Java 對象轉換為 JSON,反之亦然。它簡化了序列化和反序列化任務,為處理複雜對象結構提供自定義選項和高效性能。
最新版本的 Gson 庫可以在Maven Central Repository中找到。讓我們將依賴項添加到我們的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
}
現在讓我們考慮一個名為James
和John
的兩個人的JSONArray
:
[
{
"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
解析為一個單獨的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
匹配,或者相反,總是會導致錯誤。
與往常一樣,這些示例的源代碼可在 GitHub 上獲得。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議