什麼是 JSON ↔ YAML 轉換?
JSON(JavaScript Object Notation,RFC 8259)是一種嚴謹、以大括號為界的結構化資料文字格式;YAML(YAML Ain't Markup Language,1.2 版)是 JSON 的超集,採用縮排、換行與更易讀的語法來表達同一套值模型。兩者互轉可讓同一份設定在機器友善(JSON 用於 API、Schema 驗證、程式化轉換)與人類友善(YAML 用於程式碼審查、Kubernetes 清單、GitHub Actions 工作流)之間自由切換,而無需重新輸入任何一個鍵。
JSON ↔ YAML 轉換是如何運作的?
每一次轉換都在你的瀏覽器中使用內建的 js-yaml 函式庫(MIT,4.1.0 版)本機執行。主要步驟如下:
- 模式選擇器(自動偵測 / JSON → YAML / YAML → JSON)決定執行哪條管線。在自動偵測模式下,由輸入中第一個非空白字元決定方向 —
{或[表示 JSON;其它則視為 YAML。 - JSON → YAML:
JSON.parse驗證輸入並產生一個 JavaScript 值;jsyaml.dump(value, { indent, lineWidth: -1, sortKeys: false })寫出 YAML 1.2 形式。開啟多文件時,輸入陣列的每個元素會被輸出為獨立文件,並以---分隔符串接。 - YAML → JSON:
jsyaml.loadAll解析輸入中的每個文件(自動處理---分隔符)並放入陣列;單一文件輸入會被解包,使 JSON 輸出直接是該文件本身,而非只含一個元素的陣列。 - 縮排(2 或 4 空格)以及美化輸出皆可設定。關閉美化輸出時,會透過
JSON.stringify(value)輸出無空白的最小化 JSON。 - 結果寫入唯讀文字框。YAML 解析失敗時,錯誤訊息會包含
js-yaml在e.mark中回報的 1-基準行欄號,讓你可以直接跳到出錯位置。
為什麼用此工具轉換 JSON 與 YAML?
- 隱私:每一次解析、轉換與輸出都在你的瀏覽器中完成。資料 — 包括 Kubernetes Secret、簽署過的 JWT、專屬設定 — 永遠不會傳到我們的伺服器。
- 多文件 YAML:
jsyaml.loadAll能辨識---分隔符並回傳文件陣列,轉換器於單文件情境下解包,於多文件情境下保留為 JSON 陣列。 - 錨點與別名可解析:YAML 的
&anchor/*alias機制由js-yaml預設 schema 處理。定義一次、引用兩次的值會往返為一個 JSON 物件,其中所有引用持有相等的值。 - 無 CDN、無遙測:
js-yaml.min.js與頁面同源載入,所以本工具可在離線、企業代理伺服器與氣隙網路環境中正常運作。
JSON ↔ YAML 轉換的常見應用情境有哪些?
在 DevOps、平台工程與 API 工具鏈中,JSON 與 YAML 互轉隨處可見:
- Kubernetes 清單:把 YAML 形式的
Deployment、ConfigMap或HelmRelease轉成 JSON,讓內部政策驗證器(Joi、Ajv、OPA Rego)以程式化方式 lint,再轉回 YAML 套用到叢集。 - CI/CD 工作流:把 GitHub Actions 的
workflow.yml往返通過 JSON,讓程式碼產生器重寫 matrix 或 job 依賴關係,再把整理過的 YAML 推到 PR。 - OpenAPI 規格:把後端自動產生文件匯出的 JSON
openapi.json轉成openapi.yaml,作為人工維護的參考檢入版本庫。
JSON ↔ YAML 的往返轉換範例長什麼樣?
貼上 {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"web"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"web"}}}},在 JSON → YAML 模式按下轉換,會得到 8 列縮排 YAML,第一列為 apiVersion: apps/v1。把該 YAML 在 YAML → JSON 模式開啟美化輸出後餵回,JSON.stringify(value, null, 2) 後會逐位元組還原原物件,鍵順序也會保留 — 因為 js-yaml 的預設 schema 於兩個方向都遵循插入順序。
這個 JSON ↔ YAML 轉換器完全在我的瀏覽器中執行嗎?
是的。每次解析、轉換與輸出都會在你的瀏覽器分頁中以 JavaScript 在本機執行。內建的 js-yaml 函式庫與頁面同源載入 — 不使用 CDN、不呼叫 fetch、不呼叫 XMLHttpRequest,也不會用 navigator.sendBeacon 上報輸入。頁面一旦載入完成即可離線使用,因為它就是把第三方函式庫一併打包的靜態 HTML/CSS/JS 套件。Kubernetes Secret、JWT 載荷、簽署過的 CloudFormation YAML 與專屬設定都不會離開你的裝置。
轉換器如何處理多文件 YAML?
YAML 支援在同一串流中以僅含 --- 的列來分隔多份文件。在 YAML → JSON 方向,轉換器會呼叫 jsyaml.loadAll,把每份文件作為 JavaScript 值回傳。若只發現一份文件,JSON 輸出就是該文件本身;若發現兩份以上,JSON 輸出則為陣列。在 JSON → YAML 方向,當輸入是 JSON 陣列且多文件開關開啟時,每個陣列元素會作為獨立文件輸出,並在它們之間加入 --- 分隔符 — 對於從 JSON 資源陣列產生 kubectl apply 友善的 YAML 包很有幫助。
支援 YAML 的錨點與別名嗎?
支援 — &anchor 定義與 *alias 引用都會在載入步驟由 js-yaml 的預設 schema 解析。形如 defaults: &d\n retries: 3\n timeout: 30\njob_a:\n <<: *d\njob_b:\n <<: *d 的 YAML 會解析為一個 JSON 物件,其中 job_a 與 job_b 都包含 retries: 3, timeout: 30。合併鍵 <<(一個 YAML 1.1 擴充,js-yaml 仍然支援)在預設 schema 上同樣可用。
YAML 註解在 JSON 與 YAML 之間往返時會保留嗎?
不會 — js-yaml 會在解析步驟把註解剝離,因此 YAML → JSON → YAML 的往返會遺失每一行以 # 開頭的註解。這是 load/dump 模型的已知限制;若保留註解很關鍵,請使用具備註解感知的函式庫(如 yaml npm 套件,提供為保留 trivia 而設計的 CST + AST API),而非 js-yaml。對大多數設定轉換流程而言,這是可接受的取捨:往返後的 YAML 仍會保留所有鍵、值、錨點與別名,只是不帶人工撰寫的註解。
自訂 YAML 標籤會怎麼處理?
轉換器使用 js-yaml 的 DEFAULT_SCHEMA,可辨識 !!str、!!int、!!float、!!bool、!!null、!!seq、!!map、!!binary 與 !!timestamp — 即 YAML 1.2 core 與 JSON schema 中的全部標籤。自訂或特定應用的標籤(例如 CloudFormation 的 !Ref、Ansible 的 !vault)不會被識別,並以清楚的錯誤訊息指出不支援的標籤。針對 CloudFormation,請先以 aws cloudformation package + --output-template-file 展開自訂標籤後再貼入本轉換器。
本 JSON ↔ YAML 轉換器內建 js-yaml@4.1.0 並與頁面同源載入,原生支援多文件串流與錨點/別名,並以行欄號回報 YAML 解析錯誤,方便你直接修正原檔。無上傳、無 CDN、無遙測 — 每一個位元組都留在你的瀏覽器中。