# YAML 轉 JSON — JSON 也能轉回 YAML

兩個方向都有，而且會告訴你各自的代價。這些都不會貼進別人的伺服器。

> 在你的瀏覽器裡把 YAML 轉成 JSON、把 JSON 轉成 YAML。它讀的是 YAML 1.2，所以 yes 和 no 還是字串，而且會明確說出每個方向丟了什麼。什麼都不上傳：一份配置檔案永遠不會離開你的裝置。

本頁是一個完全在你的瀏覽器裡執行的互動式工具，地址是 https://abox.tools/zh-TW/yaml-to-json/。你交給它的任何內容都不會被上傳。下面是這個頁面用文字對該工具的全部說明；要使用它，請開啟這個地址。

## 你的 YAML 和 JSON **不會上傳**。這裡根本沒有伺服器。

轉換是對一段字串做算術，就在這裡，在這個頁面上。兩個解析器都是手寫的，都在 `src/` 裡——`shared/parse-yaml.js` 和 `shared/parse-json.js`——除此之外再沒有別的。這個工具壓根就沒有網路功能，沒有要取的，也沒有要發的。這一點在這裡比本站幾乎任何地方都更要緊：一份 YAML 檔案多半是部署配置，而部署配置多半塞滿了主機名、桶名和金鑰。

- ✗ 不上傳
- ✗ 不註冊
- ✗ 無大小限制
- ✓ 斷網可用
- ✓ 開源

## 不上傳就把 YAML 轉成 JSON 的步驟

1. **選方向。** *YAML 轉 JSON* 或者 *JSON 轉 YAML*。選單下面那行小字會在你貼任何東西之前，而不是之後，告訴你這個方向會丟什麼。
2. **貼進來，或者把檔案放上去。** 能選中能複製的都行。把檔案放到選擇框上，你自己的瀏覽器會讀它並填進輸入框——這裡沒有上傳這一步可以省略——而 `.json` 或 `.yaml` 的字尾順便就把方向定好了。
3. **選縮排。** 兩個空格、四個空格，或者一個製表符。製表符只對 JSON 提供：YAML 是按空格定義的，製表符在它裡面不是合法縮排。
4. **在出錯的地方讀錯誤。** 在這裡失敗的解析器會告訴你它遇到了什麼，在第幾行第幾列，而不是「位置 4193 處有意外的 token」。通常這就夠你修好一份配置檔案，不用再開啟別的東西。
5. **把結果拿走。** 複製，或者下載成檔案，檔名按它出來的格式取。

## 工具箱裡還有

- [XML 格式化](https://abox.tools/zh-TW/xml-formatter/): 排開了好讀的 XML，壓平了好發的 XML，還有兩個方向的 JSON 轉換。這些都不會貼進別人的伺服器。
- [文字比對](https://abox.tools/zh-TW/text-diff/): 兩段文字進來，每處差異都被標出來，逐行、逐詞。沒有一個字被貼進別人的伺服器。
- [Base64 編碼解碼](https://abox.tools/zh-TW/base64/): Base64、百分號編碼、HTML 實體、十六進位和反斜槓轉義，雙向都行。沒有一個字被貼進別人的伺服器。
- [文字與檔案分享](https://abox.tools/zh-TW/share-text/): 分享只活在這個開著的分頁裡。讀的人從你的瀏覽器直接取得加密內容，關掉分頁就結束——任何伺服器上都不留一點東西。

## 常見問題

### 我的 YAML 會被上傳到什麼地方嗎？

不會。這個頁面上的兩個解析器和兩個列印器，都是在你自己的瀏覽器裡、你自己的硬體上跑的函式。這個工具壓根就沒有網路功能，從不取任何東西，也從不發任何東西，頁面的 `Content-Security-Policy` 裡寫著它允許聯絡的每一個地址，沒有一個屬於本站。這正是拿它處理部署配置的理由：那種檔案裡塞滿主機名、桶名，偶爾還有某人打算挪走的金鑰，把它貼進別人的轉換器，就是把它給了對方。

### 把 YAML 轉成 JSON 會丟什麼？

註釋，因為 JSON 沒地方放。錨點、別名和標籤會被直接拒絕，而不是靠猜——它們各自說的事情 JSON 都說不出來，一個悄悄挑了種解釋的轉換器，會交給你一份並不是檔案原意的文件。反方向不丟任何東西：每一份 JSON 文件本來就已經是 YAML 文件。

### 我的 YAML 裡寫的是 no，JSON 出來卻是字串。為什麼？

因為它本來就是字串，而這裡讀的是 YAML 1.2，不是 1.1。在 YAML 1.1 裡，`yes`、`no`、`on` 和 `off` 都是布林值，這就是那個著名的坑：挪威的國家程式碼會變成 `false`。YAML 1.2 把這條丟掉了，這裡也一樣：只有 `true`、`false`、`null` 和 `~` 會被當成文字之外的東西讀。反過來的時候，這些詞會*帶引號*寫回去——哪怕這裡不帶引號也照樣當文字讀——因為下一個開啟這份檔案的東西未必如此。PyYAML 到現在預設還是 1.1。嚴格地讀、保守地寫，是兩邊都對的唯一組合。

### 它會保持我的鍵順序嗎？

會，兩個方向都會，而這比聽起來難。建立在 `JSON.parse` 上的轉換器會悄悄把看起來像整數的鍵挪到前面，於是 `{"10":a,"2":b}` 回來就成了 `{"2":b,"10":a}`。數字保留你打的每一位，所以一個二十位的帳號不會因為雙精度浮點丟掉最後三位。如果你*就是想*排序，有個勾選框，而且它按鍵讀起來的樣子排，不是按碼位。

### 能一次轉換好幾份 YAML 文件嗎？

不能，而且它會直說，而不是替你挑一份。帶 `---` 分隔符的檔案裝著不止一份文件，而 JSON 沒有哪種形狀表示「好幾份文件」——用陣列的話，就成了這份檔案從沒做過的斷言。一份一份轉。

### 這裡為什麼沒有 YAML 格式化？

因為 YAML 沒有值得一寫的壓縮形式——短的那種是流式風格，讀不了，而讀不了正是把檔案留成 YAML 這件事的反面。排開 JSON、XML、HTML 和 CSS 是 [JSON 格式化](https://abox.tools/zh-TW/json-formatter/)的工作，而且它也排 YAML。

### 檔案最大能有多大？

這裡沒有設限，因為沒有伺服器在為此付錢。真正的上限是你自己的裝置：幾 MB 的 YAML 沒問題，文件很長的時候，頁面會等你打字停下來再轉換，而不是跟你搶鍵盤。

### 免費嗎？需要註冊嗎？

免費，沒有帳號，不用登入，沒有試用期，也不限制你貼多少。本站有廣告，網站靠它維持；廣告拿不到關於你文字的任何東西。

### 斷網還能用嗎？

能。頁面載入一次之後拔掉網線，它照樣工作。這也是證明沒有上傳的最簡單辦法：一個把你的配置送出去轉換的工具，在你拔線的那一刻就停了。

## 這條隱私承諾怎麼核實

- **你貼進來的東西沒有出去的路。** Content-Security-Policy 裡寫著這個頁面允許聯絡的每一個地址，沒有一個屬於本站。這裡沒有任何可以收走一份貼進來的配置的接收端，就算有，程式碼裡也沒有把它送過去的東西。
- **這裡不會去取任何東西。** `src/` 裡哪裡都沒有 `fetch`，沒有 `XMLHttpRequest`，也沒有 `sendBeacon`。兩個解析器和兩個列印器都是這個頁面裡的函式：進去一段字串，出來一段字串。
- **它讀的是 YAML 1.2，所以挪威還是挪威。** 在 YAML 1.1 裡，`no` 是個布林值，這就是那個著名的坑：挪威的國家程式碼會變成 `false`。這裡讀的是 1.2，在那裡它就是它看上去的那個字串。反過來的時候，這些詞會*帶引號*寫回去，因為下一個開啟這份檔案的東西可能還是個 1.1 的讀取器。`tests/js/text-convert.test.js` 兩頭都查。
- **沒法誠實的轉換，寧可停下來。** YAML 裡的錨點、別名或者標籤，會帶著「它在第幾行」的提示結束這次轉換，而不是給你一份悄悄變了意思的 JSON 文件。JSON 沒有辦法表達「同一個節點用兩次」，而挑一種解釋，就是替你做主。
- **Google 載入了什麼，又沒拿到什麼。** 廣告和統計指令碼來自 Google，捐贈按鈕來自 Buy Me a Coffee。它們誰也沒拿到你文字裡的一個字元。讀它、解析它、寫它的每一行程式碼，都從這個源提供，也都列在儲存庫裡。
- **斷網可用。** 拔掉網線，這個工具一點變化都沒有，因為它裡面本來就沒有聯網這一步。這是最簡單的證明。

**你可以自己核對。**上面這些不用你信。這個頁面是儲存庫裡的模板和配置產生出來的，構建指令碼你能讀，也能自己跑一遍，跑出來的結果就提交在 `dist` 分支上。拿實際發給你的內容，跟你自己從原始碼構建出來的結果對一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先讀的幾個檔案：`config/site.toml` 裡是 Content-Security-Policy，寧可拒絕一個錨點也不去猜它想說什麼的讀取器在 `src/shared/parse-yaml.js`；一次轉換為什麼就是一個解析器加一個列印器、中間沒有任何同時認得兩種格式的東西，在 `src/convert.js`。
