知識庫 / JSON RSS 訂閱

解析JSONException:JSONObject文本必須以‘{’開頭(Java)

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

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
user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.