YAML フォーマットツール
YAMLとは?
YAML(YAML Ain't Markup Language)は人間可読のデータシリアライゼーション言語で、設定ファイルとデータ交換用に設計されています。簡潔、明確な構文で有名で、XMLより読みやすく、JSONより表現力があります。YAMLはインデントで階層関係を表現し、コロンでキーと値を分け、ハイフンでリスト項目を表し、設定ファイルの作成に最適です。
使い方
使い方
- 左の入力ボックスにYAMLデータを貼り付けるか入力します
- プロジェクトスタイルに合ったインデントサイズを選択します
- 「フォーマット」で整形、「圧縮」でサイズ削減、「検証」で構文チェックを行います
- 右側に結果を表示します
- 「コピー」をクリックしてクリップボードにコピーします
オプションの説明
キーボードショートカット
- Ctrl + Enterフォーマット
- Ctrl + Shift + C結果をコピー
YAMLのヒント
- YAMLはインデントが意味を持つため、CIやKubernetes、デプロイ用の設定ファイルに使う前にネストされたリストやマップを見直してください
- 可能であれば対象のツールのスキーマで検証してください。構文的に正しいYAMLでも、GitHub Actions、Docker Compose、OpenAPIでは無効になることがあります
利用シーン
仕組み
YAMLフォーマットはYAML 1.2.2仕様(2021年10月改訂)に基づいています。この仕様はJSONをYAMLの厳密なサブセットとして正式に定義しており、有効なJSONドキュメントはすべてYAMLとしてパースできます。パースは3層で進行します。プレゼンテーション層がUnicodeコードポイントをスキャンし文字エスケープを解決し、シリアライゼーション層がスカラー、シーケンス、マッピングのノードグラフを構築し、ネイティブ層がYAML Core Schemaを適用してスカラーを`!!str`、`!!int`、`!!float`、`!!bool`、`!!null`、`!!seq`、`!!map`の解決済み型に型変換します。一般的なランタイムライブラリにはNode.jsのjs-yamlや新しい`yaml`パッケージ、PythonのPyYAMLやruamel.yaml、JVMのSnakeYAMLがあります。ブラウザ側のフォーマッターは通常、js-yamlの`load`/`dump`でプレーンなJSオブジェクトにパースしてラウンドトリップします。 インデントは最も重要なプリミティブです。ASCIIスペース(U+0020)のみが許可されており、仕様§6.1でインデントにタブ文字(U+0009)を使用することは明示的に禁止されています。自動変換するコードエディタからのコピペが最もよくあるパース失敗の原因です。ブロックスタイルは列位置からネストを純粋に決定するため、子ノードは親より少なくとも1スペース(慣例では2スペース)多くインデントする必要があります。フロースタイルはJSON構文を借用し(`[1, 2, 3]`や`{a: 1, b: 2}`)、ワンライナーのためにブロックスタイル内にネストできます。ブロックスカラーはインジケーター駆動のフォールディングを使用します。`|`(リテラル)は改行をそのまま保持し、`>`(フォールド)は単一の改行をスペースに折りたたみ、空行を段落区切りとして保持します。.chompインジケーターの`-`(末尾改行を除去)と`+`(末尾改行をすべて保持)はインジケーターの後に付きます(`|-`、`>+`)。引用ルールは異なります。シングルクォートスカラーは`\\`をリテラルとして扱い、引用符の埋め込みに`''`を使用します。ダブルクォートスカラーはCスタイルのエスケープ(`\\n`、`\\t`、`\\uXXXX`)を処理します。 フォーマッターは通常、1つのブロックスタイルに正規化し、アンカーとエイリアスを再出力します。アンカー`&name`はノードをマークし、エイリアス`*name`はそれを参照し、マージキー`<<: *name`(YAML 1.1の名残で、ほとんどのパーサーでサポート)は別のマッピングからキーを現在のマッピングに引き出します。複数ドキュメントストリームは`---`開始マーカーとオプションの`...`終了マーカーで分割されます。これはKubernetesが1つのマニフェストで複数のリソースを出荷するパターンです。安全に再出力すべき2つの有名な落とし穴があります。ノルウェー問題——引用符なしのスカラー`no`がYAML 1.1スキーマで`false`として解釈される問題(国コードがブール値になる)——とCVE-2017-18342——PyYAMLの`yaml.load`が任意のPythonオブジェクトをデシリアライズできた問題(`safe_load`に切り替えて修正)。どちらも、フォーマッターがスカラーの解決を慎重に扱い、タグ付きコンストラクターを決して実行すべきでない理由です。パースは入力長に対してO(n)です。コメントはほとんどのASTベースのライブラリで破棄されます。これはYAML情報モデルの一部ではないためです。
- 仕様:YAML 1.2.2(2021年10月)。JSONはYAML 1.2の厳密なサブセットであるため、有効なJSONドキュメントはすべてYAMLとしてパースできます。主なライブラリはjs-yaml、`yaml`パッケージ、PyYAML、ruamel.yaml、SnakeYAMLです。
- インデントはASCIIスペース(U+0020)でなければなりません。仕様§6.1でインデントにタブ文字(U+0009)は禁止されています。`mapping values are not allowed here`エラーの最もよくある原因です。
- ブロックスタイル vs フロースタイル:ブロックは列位置によるネスト(慣例では2または4スペース)、フローはJSONライクな`[1, 2, 3]`や`{a: 1}`を使用。両方をネストできます。
- ブロックスカラー:`|`リテラルは改行を保持、`>`フォールドは単一改行をスペースに折りたたみ。.chompインジケーターの`-`(除去)と`+`(保持)はインジケーターに付きます(例:`|-`、`>+`)。
- アンカー`&name`はノードをマークし、エイリアス`*name`はそれを参照し、マージキー`<<: *name`は別のマッピングからキーを引き出します(YAML 1.1の名残、ほとんどのパーサーでサポート)。
- 複数ドキュメントストリームは`---`(開始)とオプションの`...`(終了)マーカーで分割されます。Kubernetesが1つのマニフェストで複数のリソースを出荷するパターンです。
- 落とし穴:ノルウェー問題(引用符なしの`no`/`yes`/`on`/`off`がYAML 1.1スキーマでブール値としてパースされる。YAML 1.2 Core Schemaは大部分を修正)とCVE-2017-18342(PyYAMLの`yaml.load`が任意のコードを実行。`safe_load`を使用すること)。
使用例
設定ファイルのインデント不揃いを修正
入力 (壊れた状態):
server:
port: 8080
host: localhost
debug: true
整形後 (2 スペース):
server:
port: 8080
host: localhost
debug: truedocker-compose.yml のサービスのネストリスト
version: '3.8'
services:
web:
image: nginx:1.25
ports:
- "80:80"
- "443:443"
depends_on:
- api
api:
image: node:20
environment:
NODE_ENV: productionKubernetes Deployment マニフェスト
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
spec:
containers:
- name: web
image: nginx:1.25jq パイプライン用に YAML を JSON へ変換
YAML 入力:
user:
id: 42
name: alice
roles:
- admin
- editor
JSON 出力:
{
"user": {
"id": 42,
"name": "alice",
"roles": ["admin", "editor"]
}
}コロン後のスペース欠落を検出
入力:
name:alice
age: 30
1 行目でエラー: コロンの後にスペースがありません
修正後:
name: alice
age: 30よくある質問
YAML 整形ではどのようなことが行われますか?
インデントの正規化(通常はスペース2つ)、引用符スタイルの統一、リストマーカーの整列、長いインライン・コレクションのブロック形式への展開などです。実際の YAML はほとんどが手作業で編集されており、スタイルが不統一になりがちです。フォーマッターはそれを揃えます。
フロー形式をブロック形式に変換できますか?
多くのビルドではフロー形式(JSON 風の {key: value, key2: value2})とブロック形式(複数行のインデント形式)を選べます。ブロック形式は人間が編集しやすく、フロー形式はコンパクトです。両者の間でラウンドトリップしてもデータは保持されますが、見た目は変わります。
なぜ引用符が変更されるのですか?
YAML では引用符なし、シングルクォート、ダブルクォートの文字列が使え、それぞれ細かな違いがあります。yes/no、true/false、on/off は引用符で囲まないと真偽値として解釈され、引用符のない数字は数値、引用符付きは文字列になります。フォーマッターは誤解釈される可能性のある値を区別するために引用符を追加することがあります。
コメントは保持されますか?
ほとんどのビルドでは YAML コメント(#)が保持されますが、AST ノードに対する位置が若干変わることがあります。キーの上のコメントは通常上のままで、同じ行の末尾コメントは付随したまま残ります。整形後は再読み込みして、コメントの位置が依然として意味をなしているか確認してください。
YAML はアップロードされますか?
いいえ。パースと整形は js-yaml などを介してブラウザ内で実行されます。ペーストされた YAML は送信されません。
YAML をラウンドトリップするとアンカーやエイリアスが変わるのはなぜですか?
YAML の & (アンカー)と * (エイリアス)構文を使うと、値を一度参照しておき再利用できます。一部のフォーマッターはデフォルトでエイリアスをインライン展開してしまい、重複排除が失われます。アンカーを保持するオプションがあるか確認してください。
YAML がタブインデントを使っている場合はどうなりますか?
YAML はインデントにタブを使うことを禁じています。スペースである必要があります。フォーマッターは設定に応じてタブをスペースに変換するか、パースを拒否します。パースエラーが発生した場合は、ペースト前にタブをスペースに置き換えてください。