JSON 轉義工具
快速對 JSON 字串進行轉義和反轉義處理
選擇轉換方式
什麼是 JSON 轉義?
JSON 轉義是將 JSON 字串中的特殊字元轉換為轉義序列的過程。常見的轉義字元包括:" 轉為 \",\\ 轉為 \\\\,換行符轉為 \n,製表符轉為 \t 等。
使用場景:當需要在 JSON 字串中嵌入另一個 JSON、在程式碼中定義 JSON 字串常量、或在資料庫中儲存 JSON 資料時,都需要進行轉義處理。
實際使用時還要區分「字串轉義」和「完整 JSON 序列化」:前者只處理文字中的特殊字元,後者會同時考慮物件、陣列、數字、布林值與空值,混用容易造成多重轉義或解析失敗。
使用方式
使用方式
- 在輸入框中貼上或輸入文字
- 點選「JSON Escape」轉義特殊字元(例如「"」變為「\"」)
- 點選「JSON Unescape」還原已轉義的字元(例如「\"」變為「"」)
- 結果會自動顯示在下方,可直接複製
轉義注意事項
- 僅針對目標環境進行轉義;JSON 字串、JavaScript 原始碼、URL 和 HTML 屬性各有不同的轉義規則。
- 還原轉義後,貼入設定檔前請檢查換行符號、反斜線和引號是否正確。
使用場景
技術原理
JSON(RFC 8259)是嚴格的文字語法;每個字串字面值必須以 ASCII 雙引號(U+0022)包裹,任何可能破壞該語法的字元都必須以反斜線跳脫序列表示。強制跳脫的字元包括:雙引號跳脫為反斜線引號、反斜線跳脫為雙反斜線,以及 U+0000 到 U+001F 的 32 個控制字元(包含 \b U+0008、\f U+000C、\n U+000A、\r U+000D、\t U+0009)。U+001F 以上的任何字元都可以其原始 UTF-8 位元組序列出現在字串中,包括 CJK 表意文字、表情符號、帶重音字母及其他增補字元。正斜線字元的跳脫是可選的(\/),但慣例是在 JSON 嵌入 HTML <script> 標籤時跳脫它,以免關閉腳本標籤序列過早結束周圍的 script 元素。 實務中會出現兩層跳脫。JSON 跳脫(語法替換)是 RFC 8259 唯一要求的:它確保字串是合法的 JSON,僅此而已。Unicode 跳脫(將每個字元改寫為 \uXXXX 或 \u{XXXXX})是一種表示選擇,而非語法要求——它只改變位元組在檔案中的呈現方式,不改變其解碼結果。CJK 文字在 JSON 中以原始 UTF-8 位元組形式已屬合法;頁面的 Unicode 跳脫模式將其改寫為 \uXXXX,適用於將字串餵入 Java 或 JavaScript 原始碼檔案的場景(周圍的解析器否則需要處理多位元組 UTF-8),但每字元會增加 4-6 個位元組並降低可讀性。 跳脫規則存在邊界情況。JSON.parse 對前導零很嚴格(01 是解析錯誤,即使 JavaScript 會將其接受為八進位 1);V8 的 JSON.stringify 始終產生最小必要跳脫(控制字元盡可能使用 \b/\n/\r/\t/\f,否則使用 \uXXXX,而正斜線 /、U+2028、U+2029 保持原樣以利人類可讀輸出)。孤立代理項(高代理項後未跟隨低代理項)在 RFC 8259 中技術上是合法的 JSON,但嚴格模式或 TypeScript 中的 JSON.parse 會將其拒絕為 InvalidString;頁面的跳脫模式會將孤立代理項替換為 \uFFFD(替代字元),使輸出能通過任何標準解析器的往返測試。 對於 JavaScript 原始碼嵌入,JSON 字串需要第三層跳脫:JS 字串字面值中的 JSON 必須跳脫反斜線本身。頁面的 JS 字串輸出模式新增了該雙重跳脫,eval 或 JSON.parse 按鈕可證明兩種編碼解碼為相同的字串。嵌入 HTML 的情境新增第四層:<、>、& 在周圍頁面中需要 HTML 實體跳脫,屬性值也需要引號跳脫。JSON-in-HTML 是眾所周知的危險場景(上述 </script> 陷阱),最好避免,改用安全的接收端如 textContent 賦值或 JSON.stringify 放入 <script type="application/json"> 區塊(透過 script.textContent 讀取,絕不使用 eval)。 JSON5(流行的超集)新增了單引號字串、多行字串、無引號鍵、尾隨逗號、NaN/Infinity 和單行 // 註解。本頁面不產生 JSON5 輸出;如需往返轉換,請使用專用函式庫。
- JSON 字串(RFC 8259)必須跳脫雙引號為反斜線引號、反斜線為雙反斜線,以及 U+0000..U+001F 的 32 個控制字元(\b \f \n \r \t,其餘為 \uXXXX)。U+001F 以上均為合法的原始 UTF-8,包括 CJK、表情符號和帶重音字母。
- 兩層「跳脫」同時存在:JSON 跳脫(語法性,必要)使字串成為合法 JSON;Unicode 跳脫(表示性)將字元改寫為 \uXXXX,僅改變可讀性,不改變有效性。
- 可選的 '/':JSON 允許 / 跳脫為 \/。慣例:嵌入 HTML <script> 中的 JSON 時跳脫它,以免關閉腳本標籤序列結束周圍的標籤。
- 原始 UTF-8 JSON 中 CJK 不被跳脫:範例「你好」是 6 個原始位元組。頁面的 Unicode 跳脫模式將其改寫為 \u4f60\u597d,用於原始碼檔案,以可讀性換取相容性。
- 孤立代理項:高代理項(U+D800..U+DBFF)後未跟隨低代理項在 RFC 8259 中技術上是合法的 JSON,但嚴格模式或 TypeScript 中的 JSON.parse 會拒絕它。頁面將孤立代理項替換為 \uFFFD,使輸出能通過嚴格解析器的往返測試。
- JSON.parse 很嚴格:前導零(01)是解析錯誤,NaN/Infinity 不是合法字面值,尾隨逗號不允許。V8 的 JSON.stringify 始終產生最小必要跳脫,正斜線 / 和 U+2028/U+2029 保持原樣以利可讀性。
- JSON-in-JS:要在 JS 字串字面值中嵌入 JSON 字串,需將反斜線加倍。頁面的「JS 字串」輸出新增了該層;對結果執行 eval 與 JSON.parse 會得到相同的字串。
- JSON5 超集:單引號字串、多行字串、無引號鍵、尾隨逗號、NaN/Infinity、單行 // 註解。頁面產生嚴格的 RFC 8259 JSON,而非 JSON5。
範例
含雙引號與反斜線的字串
輸入: He said "Hello\World"
輸出: He said \"Hello\\World\"含換行與 Tab 的字串
輸入: Line1\tIndent\nLine2
輸出: Line1\tIndent\nLine2含中文與雙引號的字串
輸入: {"name": "Alice", "msg": "He said \"Hi\""}
輸出: {\"name\": \"Alice\", \"msg\": \"He said \\\"Hi\\\"\"}常見問題
對 JSON 字串進行轉義會做什麼?
它會將輸入用引號包起來,並把每個特殊字元替換為 JSON 安全的逸出序列:" → \"、\ → \\、換行 → \n、Tab → \t、控制字元 → \u00NN。輸出會是一個合法的 JSON 字串字面值,可以直接貼到另一份 JSON 文件或程式碼編輯器中。
我為什麼會需要這個?
常見場景:在 JSON 設定檔中嵌入多行訊息、把 JSON 字串當作命令列參數傳入、在 JSON 內再放入 JSON(例如 API 請求主體本身就是經過 JSON 編碼的字串),或在記錄日誌前先消毒使用者輸入。
JSON 轉義跟 URL 編碼是同一件事嗎?
不是。JSON 轉義使用 \n、\"、\u00XX;URL 編碼使用 %20、%22、%0A。語法情境不同,逸出規則也不同。請依據目的端格式選擇對應方式。
反轉義模式能處理所有 JSON 逸出序列嗎?
可以——所有標準逸出序列(\"、\\、\/、\b、\f、\n、\r、\t、\uXXXX)都支援。位於 U+FFFF 以上的代理對(surrogate pair,例如 \uD83D\uDE00 = 😀)會被重新組合為實際的表情符號。格式錯誤的逸出序列會回報錯誤,方便您修正。
字串轉義和物件序列化有什麼不同?
轉義是把一段文字變成帶引號的 JSON 字串。序列化(JSON.stringify)則是把 JavaScript 物件轉成完整的 JSON 文件。本頁做的是前者;後者請在程式碼編輯器中將物件寫成 JSON,或使用 JSON 格式化工具。
控制字元一定會被轉義嗎?
會——這是 JSON 規範要求的。換行、Tab、NULL 以及其他 ASCII 控制字元(0x00–0x1F)必須轉義,否則結果就不是合法的 JSON。部分實作也會逸出 DEL(0x7F)以及 U+FFFF 以上的字元;本頁嚴格遵循 RFC 8259。
資料會被傳送到任何地方嗎?
不會。轉義與反轉義都在您的瀏覽器中執行。貼上的文字不會被上傳。