同一份配置:API 用 JSON,K8s 用 YAML,CI 裡又要互轉——選錯格式會導致解析失敗、註釋丟失或部署到錯誤環境。
本文面向全棧與 DevOps 工程師,對比 JSON 與 YAML 的語法差異、選型原則、5 步安全互轉流程及錨點、布林值等常見陷阱。閱讀完成後,你可以用 JSON 工具箱的 JSON ↔ YAML 轉換功能,在瀏覽器本機完成轉換與校驗。
為什麼需要理解 JSON 與 YAML
JSON 是事實上的 API 標準;YAML 是事實上的運維配置語言。團隊若在兩者間頻繁切換卻不瞭解差異,容易出現「本機 YAML 能跑、轉成 JSON 後鍵型別變了」的問題。
例如 Docker Compose 裡 ports: "8080:8080" 與 JSON 裡數字埠的混用,或 K8s 清單中 yes/no 被 YAML 解析為布林值,轉成 JSON 後客戶端行為不一致。
JSON 與 YAML 分別是什麼
JSON(JavaScript Object Notation)是嚴格的、基於文字的資料交換格式:鍵名必須雙引號、不支援註釋、適合程式解析。YAML(YAML Ain't Markup Language)以縮排表示層級,支援註釋與多種標量寫法,更適合人類編寫大型配置。
二者關係
YAML 1.2 規範中,JSON 是其子集——大多數合法 JSON 可以直接作為 YAML 解析。但 YAML 獨有特性(錨點 &、別名 *、多行字串 |)在轉 JSON 時可能丟失或需展開。
核心差異對比
| 對比維度 | JSON | YAML |
|---|---|---|
| 註釋 | ❌ 不支援 | ✅ # 行註釋 |
| 鍵名引號 | ✅ 必須雙引號 | ⚠️ 多數可省略 |
| 層級表示 | 大括號 / 方括號 | 縮排(空格) |
| 適合 API 傳輸 | ✅ 推薦 | ⚠️ 較少 |
| 適合手寫大配置 | ⚠️ 括號多 | ✅ 推薦 |
| 嚴格性 | 高,解析失敗即報錯 | 相對寬鬆,易踩隱式型別坑 |
誰適合用哪種格式
| 角色 / 場景 | 推薦格式 | 原因 |
|---|---|---|
| REST / GraphQL API | JSON | 生態統一、無歧義 |
| Kubernetes / Helm | YAML | 社群慣例、可註釋 |
| Docker Compose | YAML | 官方示例與檔案 |
| package.json / tsconfig | JSON | 工具鏈原生支援 |
| 訊息佇列 Payload | JSON | 體積小、解析快 |
典型場景選型指南
- 前後端介面契約:JSON
- GitHub Actions / GitLab CI 部分步驟:YAML
- 環境變數注入前的靜態配置:視團隊習慣,YAML 便於註釋
- 需要機器嚴格校驗的結構:JSON + JSON Schema
實操:5 步安全互轉
- 明確方向:JSON → YAML(便於閱讀編輯)或 YAML → JSON(便於 API/程式消費)
- 備份原檔案:轉換前保留一份可回滾的副本
- 在 JSON 工具箱轉換頁貼上源內容,選擇對應方向
- 校驗結果:JSON 側用校驗工具;YAML 側注意縮排與型別
- 目標環境冒煙:部署或呼叫一次,確認行為與轉換前一致
示例:同一段配置的兩種寫法
JSON:
{
"service": "api-gateway",
"replicas": 3,
"debug": false,
"ports": [8080, 8443]
}YAML:
service: api-gateway
replicas: 3
debug: false
ports:
- 8080
- 8443
互轉常見陷阱
YAML 隱式型別
- yes / no / on / off 可能被解析為布林值
- 純數字字串建議加引號,如 version: "01"
- null 與 ~ 在 YAML 中表示空值,轉 JSON 後為 null
JSON 轉 YAML 後的體積
YAML 通常更易讀但不一定更短。若僅用於傳輸,生產環境仍建議 JSON + 壓縮。
錨點與別名
YAML 的 &anchor 和 *alias 在轉 JSON 時會被展開為重複物件,需確認是否符合預期。
JSON 與 YAML 工具鏈對比
| 需求 | JSON 工具鏈 | YAML 工具鏈 |
|---|---|---|
| 瀏覽器內互轉 | JSON 工具箱 | JSON 工具箱 |
| CLI 校驗 | jq | yamllint / yq |
| K8s 應用 | 需先轉 YAML 或使用 CRD JSON | kubectl apply -f |
| Schema 約束 | JSON Schema 成熟 | 較少統一標準 |
常見問題 FAQ
所有 JSON 都能轉成 YAML 嗎?
標準 JSON 均可轉為等價 YAML。注意轉換後鍵順序、縮排風格可能與手寫 YAML 不同,但不影響語義。
YAML 裡的註釋會保留到 JSON 嗎?
不會。JSON 不支援註釋,轉換時註釋會被丟棄,重要說明請寫在檔案或 README 中。
K8s 資源用 JSON 可以嗎?
可以。kubectl 支援 JSON 清單,但社群示例與 Helm 模板以 YAML 為主,團隊協作建議統一格式。
轉換失敗最常見原因是什麼?
JSON 側:尾逗號、單引號。YAML 側:縮排混用 Tab 與空格、冒號後缺少空格。
資料會上傳到伺服器嗎?
不會。JSON 工具箱在瀏覽器本機完成轉換,適合內含敏感配置的內網檔案(仍建議脫敏)。
轉換後必須再校驗嗎?
建議務必校驗。至少執行一次 JSON 語法校驗,並在 staging 環境驗證配置生效。
總結與下一步
JSON 重嚴格與互操作,YAML 重可讀與運維友好。選型原則:對外介面與程式間通訊用 JSON;人工維護的大型靜態配置優先 YAML;互轉時始終校驗並做冒煙測試。
建議在倉庫中約定「何種檔案必須用哪種格式」,並在 CI 中加入格式校驗,避免 YAML 隱式型別導致的生產事故。