JS 轉 JSON:JavaScript 物件變成嚴格 JSON
貼上含有沒加引號的鍵、單引號、註解或結尾逗號的 JavaScript 物件,就能得到嚴格且已跳脫的 JSON。這個 JSON 轉換器用剖析器讀取文字,絕不會把它當成程式碼執行,所以你可以直接貼上主控台、設定檔或程式碼範例裡的文字。
JS 轉 JSON 的步驟
- 把物件貼到「JavaScript 物件或 JSON」欄位。貼上時會立刻轉換。如果是自己輸入,停下來約 300 毫秒後結果才會更新。
- 在「格式」選擇結果的樣子:壓縮(預設,單行)、2 個空格或 4 個空格。
- 在「嚴格 JSON」下方查看結果。下面會出現「已轉換為嚴格 JSON。」和字元數。
- 按結果正下方的「複製」。按鈕會短暫顯示「已複製」。
- 按「清除」可以清空欄位,重新開始。
舉個小例子:你貼上 {name: 'Ana', tags: ['a', 'b',], id: 0xFF}。選擇壓縮時,結果是 {"name":"Ana","tags":["a","b"],"id":255}。
可以讀取的寬鬆 JavaScript 語法
文字會用 JSON5 剖析器讀取,它了解 JavaScript 物件寫法和 JSON 的差別。下列每一種寫法都會被轉換,而不是被拒絕:
- 沒加引號的鍵:
{name: "Ana"}變成{"name":"Ana"}。 - 單引號字串:
{a: 'x'}變成{"a":"x"}。 - 結尾逗號:
[1, 2,]變成[1,2]。 - 註解:
// 備註和/* 備註 */會被移除。 - 十六進位數字:
0xFF變成255。 - 開頭的加號或單獨的小數點:
+1、.5、5.分別變成1、0.5、5。 - NaN 和 Infinity:
{a: Infinity}變成{"a":null}。 - 用反斜線拆成多行的字串,會變成沒有換行的單一字串。
字串裡的引號、反斜線和換行會自動跳脫:'He said "hi"' 會變成 "He said \"hi\""。本來就是有效 JSON 的內容,除了你選的版面之外都會原樣通過。
壓縮成一行,或用 2 個、4 個空格縮排
「格式」選單在結果上方。壓縮會把所有內容寫成一行、不留空格,適合用在請求內容、測試資料,或要貼進字串裡的值。
2 個空格和 4 個空格會產生有縮排的版面,比較好讀,也比較容易比對差異。你一選擇,結果就會改變,「複製」複製的就是你看到的內容。
無法讀取的內容與錯誤訊息
只接受資料,不接受程式碼。剖析器停下來時,會出現標題為「無法讀取這段內容」的紅色方塊,說明明確的原因和位置,例如「第 1 行,第 6 列」。像 {a:1 b:2} 會停在 b,並提醒你檢查它前面是否少了逗號、冒號、括號或引號。如果文字結束時還有括號、大括號或引號沒有關閉,就會改為顯示「文字太早結束了」。
const x = {a: 1}:會停在第一個字母。請只貼上物件。{a: 1};:會停在最後的分號。請把它刪掉。- 用反引號的字串(樣板字串)不接受。請改用單引號或雙引號。
undefined、函式或new Date()不接受,因為它們是程式碼,或沒有對應的 JSON 形式。請把日期寫成字串。- 少了逗號、冒號或括號時,會停在缺漏處後面的字元,並顯示行與列。
數字、重複的鍵與其他會改變的地方
結果由瀏覽器本身的 JSON.stringify 產生,所以數字是 JavaScript 的數字。複製之前,值得先知道這些影響:
- 大於
9007199254740991的整數會失去精確度:12345678901234567890會變成12345678901234567000。 1.0變成1,0xFF變成255。- NaN、Infinity 和 -Infinity 會變成
null。 - 如果同一個鍵出現兩次,只保留最後一個值。
如果資料本來就是有效的 JSON,只想加上縮排而且不改動任何一位數字,請用「JSON格式化工具」。要依結構描述檢查 JSON,請用「JSON Schema 驗證器」。
限制與隱私
- 最多 5,000,000 個字元。更長的文字會被拒絕,並顯示說明上限的訊息。
- 剖析時絕不會執行你的文字,所以貼上的程式碼不可能運行。
- 你的文字完全在你的裝置上轉換,不會上傳或儲存。
常見問題
JS 字串或物件要怎麼轉 JSON?
把物件的文字貼到「JavaScript 物件或 JSON」欄位。貼上時會立刻轉換,自己輸入的話則是停下來約 300 毫秒後轉換,嚴格的 JSON 會出現在「嚴格 JSON」下方。按「複製」就能帶走。請只貼物件本身,不要連 const data = {...}; 這樣的一行一起貼。
怎麼把單引號改成雙引號?
貼上文字就可以了。每個單引號字串都會變成雙引號,裡面的雙引號會自動跳脫,所以 'He said "hi"' 會變成 "He said \"hi\""。只有字串和鍵會被改動,雙引號字串裡的撇號會維持原樣。
怎麼拿掉 JSON 最後一個逗號?
貼上文字就可以了。物件或陣列最後一項後面的逗號,例如 [1, 2,],輸入時可以接受,結果的「嚴格 JSON」裡不會有它。資料的其他部分都不會改變。
JSON 可以有沒加引號的鍵或註解嗎?
嚴格的 JSON 不行:每個鍵和字串都要用雙引號,也沒有註解語法。JavaScript 物件和設定檔常常兩者都有。這個工具會讀取它們,把鍵改寫成雙引號,並移除註解,所以結果是有效的 JSON。
JSON 和 JSON5 有什麼不同?
JSON5 是比 JSON 寬鬆的超集,允許沒加引號的鍵、單引號字串、結尾逗號、註解、十六進位數字,以及其他幾種 JavaScript 風格的寫法。這個工具會讀取這些語法並寫出一般的 JSON,所以沒有不支援數值的 JSON5 文件,會變成任何剖析器都能接受的 JSON。
怎麼把 JSON 壓縮,或用 2 個、4 個空格縮排?
使用結果上方的「格式」選單。預設的「壓縮」會輸出沒有空格的單行。2 個空格和 4 個空格則是有縮排的版本。你選了其他選項,結果和「複製」帶走的內容就會立刻改變。
為什麼會顯示「無法讀取這段內容」?
因為這段文字不是剖析器看得懂的物件、陣列或值。紅色方塊會指出停下來的位置,例如「第 1 行,第 6 列」,以及該檢查什麼:前面是否少了逗號、冒號、括號或引號,或結尾還有括號、大括號、引號沒有關閉。像 const x = {...} 這樣的敘述、結尾的分號、反引號字串、undefined、函式和 new Date() 都不接受。請只貼上物件。
我貼上的 JavaScript 會被執行嗎?
不會。文字由剖析器(JSON5)讀取,絕不會經過 eval,所以你貼上的內容不可能運行。程式碼會被拒絕也是同樣的原因:函式、變數名稱或 new Date() 是錯誤,而不是要拿來計算的東西。
JSON.stringify 用法和這個工具有什麼不同?
結果是用 JSON.stringify 產生的,所以輸出規則相同。差別在輸入:JSON.stringify 需要程式碼裡真正的物件,而這裡是貼上物件的文字,寬鬆語法也可以。數字會變成 JavaScript 的數字,只有到 9007199254740991 為止是精確的,所以 12345678901234567890 會輸出成 12345678901234567000,1.0 會變成 1。NaN、Infinity 和 -Infinity 會變成 null,重複的鍵則以最後一個值為準。上限是 5,000,000 個字元,轉換在你的裝置上進行,不會上傳或儲存。