教學

JSON 常見錯誤大全:原因、範例與修復方法

系統整理 JSON 解析中常見的引號、逗號、括號、跳脫字元、非法值、重複鍵與大整數問題,並提供錯誤範例和可靠的排查順序。

2026-07-1912 分鐘

JSON 看似簡單,但一個引號、逗號或反斜線放錯位置,就可能讓整份文件無法解析。解析器通常只會回報無法繼續的位置,而那裡不一定是真正出錯的地方。

本指南整理 API 串接、設定檔與日誌中常見的 JSON 問題。每一類都包含原因、錯誤範例、正確寫法與安全的修復建議。你可以先用 JSON 驗證器 定位第一個錯誤;若輸入只是接近 JSON,可用 JSON 修復工具 產生候選結果,再逐項複核。所有處理都在瀏覽器本機完成。

快速原則:保留原始輸入,從第一個錯誤開始修復;每修一處就重新驗證。

一、先確認內容是不是標準 JSON

合法 JSON 只支援物件、陣列、字串、數字、布林值與 null。物件鍵和字串必須使用雙引號;註解、undefinedNaN、函式和日期物件都不是 JSON。

現象常見原因優先檢查
Unexpected token非法字元、單引號或未加引號的鍵錯誤位置附近的引號
Unexpected end of JSON input缺少結束符號或資料遭截斷檔案或回應結尾
Expected ',' or '}'屬性之間少了逗號前一個值的結尾
Bad control character字串內有未跳脫的換行或定位字元反斜線與控制字元
解析成功但值改變重複鍵或不安全的大整數資料型別與語意

二、鍵名或字串沒有使用雙引號

JavaScript 物件允許單引號和未加引號的鍵,但標準 JSON 不允許。

{ name: 'Alice', 'role': 'admin' }

應改為:

{ "name": "Alice", "role": "admin" }

不要直接將全文的單引號全部取代為雙引號;字串內的撇號和跳脫字元可能因此損壞。

三、屬性或陣列元素之間少了逗號

{
  "name": "Alice"
  "active": true
}

正確寫法是在前一個值後加入逗號:

{
  "name": "Alice",
  "active": true
}

看到 Expected ',' 時,先檢查錯誤位置前面的完整值,而不只是被標示的字元。

四、物件或陣列末尾多了逗號

標準 JSON 不允許最後一個成員後保留逗號。

{
  "name": "Alice",
  "active": true,
}

刪除 true 後的逗號即可。接著可使用 JSON 美化工具 重新解析並統一縮排。

五、缺少右括號、右方括號或結束引號

Unexpected end of JSON input 表示解析器讀到結尾時,物件、陣列或字串仍未關閉;也可能代表網路回應或複製的日誌遭到截斷。

{
  "user": {
    "name": "Alice",
    "tags": ["admin", "editor"]
}

外層物件還少一個右大括號。但若資料來自 API,不要立刻猜測並補上括號;先確認傳輸是否完整。工具能補語法符號,卻無法還原遺失的欄位。

六、字串包含非法跳脫字元

JSON 以反斜線表示跳脫。雙引號、反斜線、換行和定位字元應寫成 \"\\\n\t

錯誤:

{
  "path": "C:\new\reports",
  "message": "He said "hello""
}

正確:

{
  "path": "C:\\new\\reports",
  "message": "He said \"hello\""
}

字串也不能直接跨行;需要換行時應使用 \n

七、JSON 中含有註解

標準 JSON 不支援 ///* ... */ 註解。請移除註解,或將必要說明轉為明確欄位。不要用簡單的正規表示式刪除所有 // 後內容,否則可能誤刪 https:// 網址。

八、使用 JSON 不支援的值

布林值與空值只能寫成小寫的 truefalsenull。Python 的 TrueFalseNone,以及 JavaScript 的 undefinedNaNInfinity 都不合法。

{ "active": True, "nickname": None, "score": NaN }

可能的候選修復是:

{ "active": true, "nickname": null, "score": null }

NaN 應變成 null、字串或直接移除,必須依業務規則決定。

九、一份文件串接了多個物件

日誌常使用每行一個 JSON 物件的 NDJSON/JSON Lines 格式。每行合法,不代表全文是一份合法 JSON。

{"id": 1, "status": "ok"}
{"id": 2, "status": "failed"}

若目標系統需要標準 JSON,應轉為陣列,並在物件之間加入逗號:

[
  {"id": 1, "status": "ok"},
  {"id": 2, "status": "failed"}
]

十、JSON 被重複編碼

若解析成功後得到一整段充滿反斜線的字串,資料可能被序列化了兩次:

"{\"name\":\"Alice\",\"active\":true}"

第一次解析得到字串,第二次才得到物件。通常應從資料產生端修正為只序列化一次,但也要先確認 API 契約是否刻意以字串儲存 JSON。

十一、重複鍵:語法可能合法,結果卻不可靠

{
  "role": "user",
  "role": "admin"
}

許多解析器會保留最後一個值,但不同語言和安全元件的行為可能不同。應在輸入階段拒絕重複鍵,並修正資料產生端。普通 JSON.parse 完成後,遭覆寫的值通常已經遺失。

十二、超大整數發生精度遺失

JavaScript 的 Number 無法精確表示所有大於 9007199254740991 的整數。資料庫 ID 或雪花 ID 可能在解析後改變。

{ "userId": 9007199254740993 }

識別碼較安全的傳輸方式是字串:

{ "userId": "9007199254740993" }

已經失去精度的數字再轉為字串,也無法恢復原始數字。

十三、可靠的排查順序

  1. 保存原始文字,不要覆蓋唯一副本。
  1. 確認複製、日誌或傳輸沒有截斷內容。
  1. JSON 驗證器 找到第一個錯誤。
  1. 檢查錯誤位置之前的引號、逗號和括號。
  1. 每修一處就重新驗證。
  1. JSON Diff 比較原始內容與候選結果。
  1. JSON 樹狀檢視器 檢查巢狀結構和型別。
  1. 語法通過後,繼續驗證必填欄位與業務規則。

付款、權限、醫療、稽核或資料庫遷移資料不應在無人確認時自動改寫。工具可以處理明確的語法錯誤,不能猜測遺失值或業務含義。

總結

多數 JSON 解析錯誤來自引號、逗號、括號、跳脫字元和非標準值。保留原文、從第一個錯誤開始,並在每次修改後重新驗證。語法通過後,仍要檢查重複鍵、大整數、型別與資料語意。你可以先使用 JSON 修復工具,再透過 JSON 驗證器JSON Diff 獨立複核。

Ene Chen

致力於為開發者提供最佳的 JSON 處理工具

相關文章

更多文章即將發布...

返回部落格

相關工具推薦

常見問題

關於跟進更新、選題與互動方式。

如何第一時間看到新文章?

收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。

部落格主要寫什麼?

圍繞 JSON 驗證、格式化、轉換與除錯流程,以及 JSON Work 工具更新,與站內工具的本地能力互相呼應。

可以建議教學主題嗎?

可以。請透過關於頁的聯絡方式或 GitHub 回饋;我們會優先安排貼近真實開發情境的教學。