JSON ⇄ YAML Converter
YAMLの暗黙型変換の罠|on/off/yes/noが勝手にbooleanになる問題
2026-01-13
この記事を読むと
YAMLの暗黙型変換を理解し、本番事故を未然に防げるようになる。
この仕様を知らないと、YAMLはエラーを出さずに静かに壊れる。
何が起きるか
YAMLは「親切」に型を推測する。これが事故の元。
# 入力(意図:すべて文字列)
enabled: on
port: 01
optional: yes
// JSONに変換後(実際の解釈)
{
"enabled": true,
"port": 1,
"optional": true
}
文字列のつもりが、勝手にbooleanや数値になる。
⚠ 本番で起きる事故
GitHub Actions が動かない
env:
FEATURE_FLAG: on # ← true になる
環境変数 FEATURE_FLAG を文字列 "on" として使うつもりが、true になる。
アプリが "on" という文字列を期待している場合、動作しない。
docker-compose が起動しない
services:
app:
ports:
- 022:22 # ← 8進数として解釈される可能性
environment:
DEBUG: on # ← true になる
Kubernetes の設定が効かない
metadata:
labels:
country: NO # ← false になる(ノルウェー国コードのつもり)
CI が謎の失敗をする
version: 3.10 # ← 3.1 になる
バージョン 3.10 のつもりが 3.1 と解釈され、互換性エラー。
危険な値一覧
boolean扱いされる
# すべて true になる
- on
- yes
- true
- True
- TRUE
- y
- Y
# すべて false になる
- off
- no
- false
- False
- FALSE
- n
- N
数値扱いされる
# 数値になる
version: 1.0 # → 1
code: 01 # → 1
port: 080 # → 8進数として解釈される可能性
octal: 0o17 # → 15(8進数)
hex: 0xFF # → 255(16進数)
null扱いされる
# null になる
value: ~
value: null
value: Null
value: NULL
value: # 空値
対策:クォートで囲む
文字列として扱いたい値は、必ずクォートで囲む。
# 安全
enabled: "on"
port: "01"
version: "3.10"
country: "NO"
迷ったらクォート
| 値 | クォートなし | クォートあり |
|---|---|---|
on | true | "on" |
off | false | "off" |
yes | true | "yes" |
no | false | "no" |
01 | 1 | "01" |
3.10 | 3.1 | "3.10" |
NO | false | "NO" |
実際の修正例
Before(危険)
services:
app:
ports:
- 80:80
environment:
FEATURE_FLAG: on
DEBUG: yes
VERSION: 3.10
After(安全)
services:
app:
ports:
- "80:80"
environment:
FEATURE_FLAG: "on"
DEBUG: "yes"
VERSION: "3.10"
このツールの修正機能
YAML → JSON変換時に暗黙型変換を検出し、警告を表示する。
「修正」ボタンを押すと、入力YAMLの該当箇所が自動的にクォートで囲まれる。
YAMLバージョンによる違い
| バージョン | on/off の扱い |
|---|---|
| YAML 1.1 | boolean |
| YAML 1.2 | 文字列(仕様上) |
ただし多くのパーサーはYAML 1.1互換モードで動作する。 YAML 1.2だから安全、とは限らない。
チェックリスト
本番投入前に確認:
-
on/off/yes/noを使っていないか - 使っている場合、クォートで囲んでいるか
- 先頭ゼロの値がないか
- バージョン番号(
3.10等)がクォートで囲まれているか - ポート番号がクォートで囲まれているか
まとめ
| 危険な値 | 解釈 | 対策 |
|---|---|---|
on/yes/y | true | "on" |
off/no/n | false | "off" |
01 | 1 | "01" |
3.10 | 3.1 | "3.10" |
NO | false | "NO" |
YAMLはエラーを出さない。間違った値として静かに処理される。迷ったらクォートで囲め。
関連記事
- YAML構文の基本 — 基本文法
- docker-compose.ymlの書き方 — 実践での注意点
- YAML完全ガイド — シリーズ全体のナビ