YAML
1 tools
データシリアライゼーションフォーマット
データシリアライゼーションは、構造化データを保存または転送可能な形式に変換し、後で再構築できるようにするプロセスです。
JSON、YAML、TOML、XMLはソフトウェア開発における4つの主要なテキストベースのシリアライゼーションフォーマットです。
JSONとYAMLの並列比較
JSONとYAMLは同じデータモデルを表します。YAMLはJSONの厳格なスーパーセットです——有効なJSONドキュメントはすべて有効なYAMLです。
{
"server": {
"host": "localhost",
"port": 8080,
"debug": true
},
"database": {
"url": "postgres://localhost/mydb",
"pool": 10
}
}server: host: localhost port: 8080 debug: true database: url: postgres://localhost/mydb pool: 10
YAMLは括弧の代わりにインデントを使用し、ほとんどの文字列値の引用符を省略します。これにより人間が編集するファイルでより compact で読みやすくなります。
フォーマット比較
| フォーマット | 可読性 | コメント | 配列 | 最適な用途 |
|---|---|---|---|---|
| JSON | ★★★☆☆ | コメントなし | ネイティブ | API、データ交換 |
| YAML | ★★★★★ | あり(#) | ネイティブ | 設定ファイル、IaC |
| TOML | ★★★★☆ | あり(#) | ネイティブ | アプリ設定(Rust、Python) |
| XML | ★★☆☆☆ | あり(<!-- -->) | 繰り返し要素 | ドキュメント、SOAP、SVG |
YAMLの落とし穴
YAMLは強力ですが、開発者を驚かせる有名なエッジケースがあります:
裸の値'NO'はYAML 1.1でブール値falseとして解釈されます。NO(ノルウェー)、OFF、FALSE、Nなどの国コードはすべてfalseとして解析されます。常に曖昧な文字列を引用符で囲んでください。
YAMLは構造を定義するためにインデントを使用します。余分なスペース1つやタブ文字1つで文書の意味が完全に変わる可能性があります。YAMLではタブは禁止——スペースのみ使用できます。
数値、ブール値、またはnullのように見える値は自動的に変換されます。文字列として保持したい値には引用符を使用してください。
YAML仕様はインデントにタブ文字を使用することを明示的に禁止しています。YAMLファイルではスペースを使用するようにエディターを設定してください。
YAMLには2つの複数行文字列インジケーターがあります:|(リテラルブロック、改行を保持)と>(折り畳みブロック、改行をスペースに変換)。
YAMLのアンカー(&)とエイリアス(*)はノードの再利用を可能にしますが、循環参照を作成する可能性があります。
YAMLのユニークな機能
コメント
YAMLは#文字でコメントをサポートします。これは設定ファイルにおけるJSONに対する最大の実用的な利点の1つです。
アンカーとエイリアス
YAMLでは&アンカー名でノードを一度定義し、*アンカー名でどこでも再利用できます。
複数行文字列
YAMLは2つのモードのブロックスカラーをサポートします:リテラルブロック(|)は改行を正確に保持し、折り畳みブロック(>)は改行をスペースに変換します。
変換が必要な場合
GitHub Actions、GitLab CI、CircleCIはネイティブでYAMLを使用します。プログラムでパイプライン設定を生成する場合、JSONオブジェクトを構築してYAMLに変換する方が簡単なことが多いです。
KubernetesリソースはYAMLで定義されますが、一部のツールはJSONを出力します。フォーマット間の変換により、APIレスポンスを検査できます。
REST APIはJSONを返します。このデータをYAMLベースの設定システムに入力する際、コンバーターがギャップを埋めます。
あるツールから別のツールへの移行は、多くの場合、設定フォーマットの変換を意味します。
JSON Schemaツールはより成熟しています。一般的なパターン:可読性のためにYAMLで設定を作成し、検証のためにJSONに変換します。
内部ツールはYAML設定を使用し、外部APIはJSONを必要とする場合があります。
よくある質問
はい。YAML 1.2はJSONの厳格なスーパーセットです——有効なJSONドキュメントはすべて有効なYAMLです。
YAMLはJSONにないコメントをサポートします。YAMLは深くネストされた構造にも対してコンパクトです。
TOMLは設定ファイル向けに設計されており、明確なINIスタイルの構文と明示的な型を持っています。Rust(Cargo.toml)とPython(pyproject.toml)の標準です。
まれです。JSONはほとんどのパーサーでキーの順序を保持します。YAMLはJSONに相当するものがないアンカーとタグをサポートします。
JSON.stringifyは配列内のundefined値をnullに変換し、オブジェクトから省略します。
はい。YAMLはJSONのスーパーセットなので、YAMLドキュメント内にJSON構文を直接埋め込むことができます。