~/tools / LLM JSON Repair
LLM JSON Repair — 修正 AI 模型回傳的損壞 JSON
修正 AI 模型回傳的「幾乎是 JSON」:移除程式碼區塊與多餘的說明文字、刪除結尾逗號與註解、修正引號、鍵名與 Python 值,並列出確切修改了哪些地方。內容不會離開你的瀏覽器。
只會套用有唯一明確答案的修正。其他情況會回報位置,而不是用猜的。
所有處理都在你的瀏覽器中執行,貼上的文字不會被上傳。
語言模型常把 JSON 包在程式碼區塊和一句說明裡,語法也常出錯:結尾多一個逗號、使用單引號、夾帶註解、把 true 寫成 True。JSON.parse 會拒絕這些內容。本工具會從文字中找出 JSON,只修復有唯一明確修法的問題,並列出每一項修改,讓你自行判斷。如果輸出被截斷,它會把尚未關閉的部分補上,並提醒你資料可能有缺漏。它不會猜測:無法修復的輸入會回報出錯位置,而不是被悄悄改動。
使用情境
- 在把模型的回覆送進 JSON.parse 或設定檔之前先修正
- 清理 JSON 前後附帶程式碼區塊與說明文字的回覆
- 確認改了哪些地方,避免修復後的值在不知不覺中流入正式環境
使用方法
- 貼上模型的回覆,或載入範例。
- 查看修復後的 JSON,以及下方的修改清單。
- 複製結果。以琥珀色標示的修改可能會遺失資訊,請務必確認。
什麼才算合法的 JSON
- 字串和成員名稱只能使用雙引號。單引號不屬於這套語法。
- 沒有註解。唯一允許的填充是空白字元。
- 逗號只能放在成員或元素之間,所以結尾逗號是不允許的。
- 值可以是物件、陣列、數字或字串,或是 false、null、true 其中之一。Infinity、NaN 和 undefined 都不是 JSON 的值。
- 數字不能有前導的零或前導的 +,小數點兩側都必須有數字,所以 012、+5、.5 和 5. 全都是無效的。
- 字串內的控制字元 U+0000 至 U+001F 必須跳脫,所以字串中的原始換行是無效的。
- 最上層可以是任何值,不一定是物件或陣列。
模型的輸出通常是怎麼壞掉的
| 問題 | 範例 | 本工具的處理 |
|---|---|---|
| 程式碼區塊與多餘的說明 | Sure! ```json { … } ``` Hope this helps | 只取出 JSON |
| 結尾逗號 | [1, 2,] | 移除該逗號 |
| 註解 | {"a": 1 // note} | 移除該註解 |
| 單引號 | {'a': 'b'} | 改用雙引號 |
| 沒有引號的鍵名 | {a: 1} | 為鍵名加上引號 |
| Python 的值 | {"ok": True, "x": None} | 改寫成 true 和 null |
| 字串中的原始換行 | "line one⏎line two" | 跳脫成 \n |
| NaN 或 undefined | {"x": NaN} | 改寫成 null,並警告該值已遺失 |
| 被截斷的回覆 | {"items": [{"id": 1}, {"id": | 關閉尚未結束的部分,並警告資料可能有缺漏 |
哪些可以安全修復,哪些不行
當損壞的文字只有一種合理的解讀時,修復才是安全的。結尾逗號、註解或程式碼區塊都可以移除,而不改變資料所表達的內容。其他的修改則會改變語意,所以會被標示出來,請你自行確認:把被截斷的回覆補上結尾,得到的是缺少資料的合法 JSON;把 NaN 改成 null,則是丟掉了原本的值。
JSON 本身還有兩項限制。RFC 8259 指出,物件內的名稱應當是唯一的,名稱重複時軟體的行為無法預期;本工具與 JSON.parse 一樣保留最後一個。該 RFC 也指出,若軟體所預期的範圍與精確度不超過 IEEE 754 雙精度浮點數,互通性會很好。本工具會保留你所寫的數字原樣,但把很長的整數解析成雙精度浮點數的程式會將它四捨五入。介於 -(2^53)+1 與 (2^53)-1 之間的整數是精確的。
更好的做法:請 API 直接輸出結構化資料
修復只是備援手段。模型 API 可以把輸出限制在某個結構(schema)內,三家廠商的文件說法各有不同。
- OpenAI:Structured Outputs 會讓模型產生符合你的 JSON Schema 的回應,而 JSON mode 只保證是合法的 JSON。拒絕回答(refusal)時可能不符合 schema,而達到最大 token 上限的回應則是不完整的(status 為 incomplete,原因為 max_output_tokens)。
- Anthropic:結構化輸出採用受限解碼,使回應遵循你的 schema,文件指出這在大多數情況下成立。拒絕回答(stop_reason 為 refusal)或因 max_tokens 而被截斷的回覆,可能不符合 schema,所以解析之前請先檢查 stop_reason。
- Google Gemini:模型被設定為產生符合你所給 schema 的 JSON。語意上的正確性並無保證,所以請驗證這些值,而且 minLength 和 maxLength 等部分限制並不會強制執行。
這三份文件都沒有承諾,在輸出被截斷時仍會是合法的 JSON。在信任解析後的結果之前,請先確認模型為什麼停止。
出處(確認於 2026-10-23): RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format / OpenAI: Structured Outputs / Anthropic: Structured outputs / Google AI for Developers: Structured output
FAQ
它能修正哪些問題?
它會移除程式碼區塊以及 JSON 前後的文字;移除結尾逗號與 // 或 /* */ 註解;把單引號和彎引號改成雙引號;為沒有引號的鍵名加上引號;把 True、False、None 改成 true、false、null;在各行之間補上缺少的逗號;對字串中的原始換行字元做跳脫;並把 +5、.5、0x1F 這類數字改寫成合法的 JSON 數字。
哪些內容絕對不會改?
值。字串會逐字元原樣保留,數字也保留原本的位數,因此像 12345678901234567890 這樣的長 ID 不會被四捨五入。重複的鍵名比照 JSON.parse:以最後一個為準。
如果回覆被截斷了怎麼辦?
它會關閉尚未結束的字串、陣列與物件,並刪除還沒有值的鍵。這樣文字會變成合法的 JSON,但並不完整,所以結果會標示為資料可能有缺漏。與其相信被截斷的結果,不如請模型繼續輸出,或調高它的輸出上限。
為什麼 NaN 或 undefined 變成了 null?
JSON 沒有 NaN、Infinity 或 undefined。本工具會改寫成 null 並加上標記,因為原本的值已經遺失。
為什麼有些輸入會被拒絕?
當沒有唯一明確的修法時,例如用省略號(...)代替被省略的項目,或在該放值的位置出現了一個裸字詞,它會停下來並顯示位置,而不是猜測。
文字會傳送到伺服器嗎?
不會。修復作業在你的瀏覽器中執行。