解決 Java 中的 JSONException 異常:JSONObject 文字必須以“{”開頭
1. 概述
在 Java 中使用 JSON 時,開發人員面臨的最常見的執行時間錯誤之一是org.json.JSONException: JSONObject text must begin with '{' at character 0 。
乍一看,這似乎很晦澀難懂。但一旦我們了解了背後的原理,修復起來就很容易了。
在本教程中,我們將探討為什麼會出現這種異常,它的含義以及如何透過清晰的範例來解決它。
2. 理解錯誤
當使用org.json套件中的org.json函式庫(也稱為JSON-java時,通常會發生JSONException異常。
當我們從字串建立JSONObject時,建構子期望該字串表示一個有效的 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 空字串或 Null 字串
有時,由於 API 呼叫失敗或變數未初始化,JSON 來源可能為空或傳回 null。
如果我們嘗試直接解析這樣的輸入, JSONObject建構子會拋出JSONException :
String json = "";
JSONObject obj = new JSONObject(json);
上述程式碼失敗,因為空字串不是有效的 JSON,它不以 { 或 [ 開頭。
為了安全地處理這種情況,在嘗試解析之前,請務必檢查是否存在空字串或null字串:
if (json != null && !json.trim().isEmpty()) {
JSONObject obj = new JSONObject(json);
} else {
System.out.println("Empty or null JSON string");
}
這種簡單的驗證確保即使回應缺失或為空,我們的程式碼也不會出錯,從而使我們的 JSON 解析邏輯更加可靠和強壯。
4. 結論
在本文中,我們看到,一旦我們了解了org.json庫如何解釋數據,在 Java 中使用 JSON 就變得輕而易舉。
一個位置錯誤的 [ 或 { 可能會造成混淆,但透過仔細的驗證、日誌記錄和一致的解析邏輯,我們可以像專業人士一樣處理 JSON。
與往常一樣,本文中提供的程式碼可在 GitHub 上找到。