1. 概述
當在 Java 中處理 JSON 時,開發人員最常見的一類運行時錯誤是 <em >org.json.JSONException: JSONObject text must begin with ‘{‘ at character 0</em>。
乍一看,這似乎有些晦澀難懂。但一旦我們瞭解其背後的機制,就能輕鬆解決它。
在本教程中,我們將探討此異常的發生原因、其含義以及如何通過清晰的示例進行解決。
2. 錯誤理解
<em>JSONException</em> 通常在使用來自 <em>org.json</em> 包(也稱為 <em>JSON-java</em>)的 <em>org.json</em> 庫時發生的。
當我們從字符串創建 <em>JSONObject</em> 時,構造函數期望該字符串代表一個有效的 JSON 對象:
JSONObject json = new JSONObject("{\"name\":\"Baeldung\"}");這段代碼可以正常工作,因為字符串以 `{` 開頭並以 `}` 結尾,這符合 JSON 對象格式。
但是,如果傳遞的不是有效的 JSON 對象,例如:
JSONObject json = new JSONObject("[1, 2, 3]");我們會遇到這個錯誤:org.json.JSONException: JSONObject text must begin with ‘{‘ at 1 [character 2 line 1]。
問題的核心在於我們嘗試解析的 JSON 數據類型。
JSON 結構主要有兩種類型:
如果我們的輸入字符串以以下之一開頭:
- { – 它代表一個 JSON 對象
- [ – 它代表一個 JSON 數組
因此,如果我們的輸入以 [ 開頭,但我們嘗試將其解析為 JSONObject,我們將會看到這個確切的錯誤。
3. 導致錯誤的常見場景
讓我們來看幾個實際案例,其中這個異常經常出現。
3.1. 將 JSON 數組解析為 JSONObject
這是最常見的導致錯誤的場景。我們可能會從 API 接收到一個 JSON 數組,卻錯誤地嘗試將其解析為 JSONObject:
String jsonResponse = "[{\"id\":1, \"name\":\"Alice\"}, {\"id\":2, \"name\":\"Bob\"}]";
JSONObject json = new JSONObject(jsonResponse);這段代碼之所以失敗,是因為JSON字符串以“[”開頭,表明它是一個數組,而不是一個對象。
為了解決這個問題,我們應該使用JSONArray類,它正確地表示了JSON對象的列表:
JSONArray jsonArray = new JSONArray(jsonResponse);
System.out.println(jsonArray.getJSONObject(0).getString("name"));現在,代碼無需產生錯誤,並且我們可以使用 getJSONObject(index) 方法輕鬆訪問數組中的每個元素。
3.2. 從 API 接收無效 JSON
有時,API 會返回格式錯誤的響應(例如 HTML 或純文本)而不是 JSON。例如:
String response = "<html>Server Error</html>";
JSONObject json = new JSONObject(response);為了解決這個問題,始終在解析之前驗證響應:
if (response.trim().startsWith("{")) {
JSONObject json = new JSONObject(response);
} else {
System.out.println("Invalid JSON response: " + response);
}這確保我們只解析有效的 JSON。
3.3. 空字符串或空值
有時,JSON 來源可能為空或由於 API 調用失敗或未初始化變量而返回 null。
如果我們嘗試直接解析此類輸入,JSONObject 構造函數將拋出 JSONException:
String json = "";
JSONObject obj = new JSONObject(json);這段代碼之所以失效,是因為空字符串在JSON中無效,它沒有以“{”或“[”開頭。
為了安全地處理這種情況,在嘗試解析之前,始終檢查是否存在空或空字符串:
if (json != null && !json.trim().isEmpty()) {
JSONObject obj = new JSONObject(json);
} else {
System.out.println("Empty or null JSON string");
}這個簡單的驗證確保我們的代碼在響應缺失或為空時不會中斷,從而使我們的JSON解析邏輯更加可靠和健壯。
4. 結論
在本文中,我們瞭解到使用 Java 處理 JSON 變得輕鬆自如,這取決於我們理解 org.json 庫如何解釋數據。
單個位置的 [ 或 { 可能會導致混淆,但通過仔細的驗證、日誌記錄和一致的解析邏輯,我們可以像專業人士一樣處理 JSON。
如往常一樣,本文中提供的代碼可在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/json-modules/json-3