跳至內容

JSON 轉 YAML

將 JSON 轉成 YAML,也支援 YAML 轉回 JSON。

即時
輸入

這個工具的用途

將 JSON 與 YAML 互相轉換,完全在你的 瀏覽器內完成。轉換可完整來回:物件鍵順序、純量型別、巢狀深度都會 保留。貼上 Kubernetes manifest、GitHub Actions workflow、Docker Compose 檔案,即可拿到嚴格的 JSON 進行程式化編輯;貼上 JSON 載荷, 則拿到人類能在 pull request 差異中瀏覽的 YAML 版本。

預設輸出為 block style(可讀形式),縮排可設為 2 或 4 個空白。 需要逸出的字串會以單引號包覆(不含特殊字元時)或雙引號(含特殊 字元時)——這是 Python 的 yaml 套件採用的相同啟發式, 因此輸出能乾淨地通過 PyYAML 來回轉換。

使用步驟

貼上 JSON(或載入範例),選擇縮排(2 或 4 個空白),即可在右側讀到 YAML。切換 YAML → JSON instead 可反向——在迭代 YAML 設定、想驗證它能否通過嚴格 JSON parser 來回時很有用。

輸入: {"service":"devsmiths","version":2,"endpoints":[{"path":"/json/formatter","method":"GET"},{"path":"/json/repair","method":"POST"}],"public":true}

輸出(YAML):

service: devsmiths
version: 2
endpoints:
  - path: /json/formatter
    method: GET
  - path: /json/repair
    method: POST
public: true

限制與邊界情況

  • YAML 支援 JSON 沒有的概念:anchors(&name)、aliases (*name)、明確 tag(!Ref !!binary)。YAML → JSON 時 anchor 會就地展開, tag 標記會被丟棄;資料保留,YAML 特有語法不保留。
  • --- 分隔的多文件 YAML 串流不能在單次轉換中處理—— 請在編輯器內拆開,每個文件分別轉換。
  • parser 遵循 YAML 1.2,因此 不會yes / no / on / off 視為布林 (YAML 1.1 的「挪威問題」)。要表示文字請加引號;要表示布林請寫true / false
  • 0 開頭的整數字面值是十進位,不是八進位——這是 YAML 1.2 vs 1.1 的另一個差異,從 PyYAML 5.x 遷移過來的團隊常被 絆到。八進位需要明確的 0o 前綴。
  • 絕對值超過 ±2^53 的數字在任何基於 JavaScript 的 parser 都會 失去精度——雙向皆然。若精度重要,請把大整數包成字串。
  • 輸入為無效 JSON 時請先用 JSON Repair; 轉換器只接受嚴格的 RFC 8259 JSON。 延伸閱讀:JSON vs YAML vs XML

常見問題

YAML anchors 與 aliases 會被保留嗎?
JSON → YAML:不會。JSON 沒有「參照」的概念,轉換器沒東西可以 anchor。YAML → JSON:anchors 會在解析時就地展開,因此產生的 JSON 內每個參照點都填上展開後的值。資料保留,YAML 的共用語法不保留。
像 !Ref、!Sub、!!binary 這類 YAML tag 會怎麼處理?
自訂 tag(CloudFormation 常見的 !Ref / !Sub 風格)不是標準 YAML 1.2 的一部分——它們是應用層的擴充。parser 會忽略 tag 註記,讀取下方的純量值,因此 `!Ref MyBucket` 會變成字串 `MyBucket`。CloudFormation 的情境請改用 AWS CLI 內建的 YAML 載入器;在此工具轉成 JSON 會剝除 !Ref 的語意。
我的 Kubernetes manifest 含多個 `---` 文件,為什麼失敗?
多文件 YAML 串流目前不支援單次來回。解法:在編輯器內以 `---` 為界拆開,個別轉換,然後在消費端把 JSON 輸出合併成陣列。Kubernetes 本身 apply 時 YAML 與 JSON 都接受,所以臨時檢查就直接 `kubectl apply -f` 對著 YAML 跑。
為什麼 `yes` 回來是字串而不是布林?
刻意如此。本 parser 實作的 YAML 1.2 只把 `true` / `false` 視為布林。YAML 1.1 曾把 `yes` / `no` / `on` / `off` 視為布林,引發著名的「挪威問題」(國碼 `NO` 被當成 `false`)。YAML 1.2 為此縮減了布林拼法;parser 遵循規範。
YAML 輸出能透過 PyYAML、ruamel.yaml、Go 的 yaml.v3 來回嗎?
值層面的來回沒問題——每個純量、列表、map 都會保留。註解不保留(JSON 沒有註解可被保留到 JSON → YAML 方向),anchor 重用也不會被重建(中間的 JSON 沒有 anchor)。若要透過 ruamel.yaml 的 RoundTripLoader 做格式保留來回,請直接在 YAML 內作業,不要繞過 JSON。
可以把 JSON Schema 轉成 OpenAPI YAML 嗎?
機械層面可以——貼上 JSON Schema,拿到 YAML。語意層面只有當 schema 本身已經是 OpenAPI 文件的形狀(有 `paths`、`components` 等)才有用。若要在 JSON Schema 不同 draft 之間或 OpenAPI 3.0 vs 3.1 之間轉換,需要 schema-aware 工具,而非語法層轉換器。

內容審閱者: