YAML

1 tools

データシリアライゼーションフォーマット

データシリアライゼーションは、構造化データを保存または転送可能な形式に変換し、後で再構築できるようにするプロセスです。

JSON、YAML、TOML、XMLはソフトウェア開発における4つの主要なテキストベースのシリアライゼーションフォーマットです。

JSONとYAMLの並列比較

JSONとYAMLは同じデータモデルを表します。YAMLはJSONの厳格なスーパーセットです——有効なJSONドキュメントはすべて有効なYAMLです。

JSON
{
  "server": {
    "host": "localhost",
    "port": 8080,
    "debug": true
  },
  "database": {
    "url": "postgres://localhost/mydb",
    "pool": 10
  }
}
YAML
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つのモードのブロックスカラーをサポートします:リテラルブロック(|)は改行を正確に保持し、折り畳みブロック(>)は改行をスペースに変換します。

変換が必要な場合

CI/CDパイプライン設定

GitHub Actions、GitLab CI、CircleCIはネイティブでYAMLを使用します。プログラムでパイプライン設定を生成する場合、JSONオブジェクトを構築してYAMLに変換する方が簡単なことが多いです。

Kubernetesマニフェスト

KubernetesリソースはYAMLで定義されますが、一部のツールはJSONを出力します。フォーマット間の変換により、APIレスポンスを検査できます。

APIレスポンスの処理

REST APIはJSONを返します。このデータをYAMLベースの設定システムに入力する際、コンバーターがギャップを埋めます。

設定の移行

あるツールから別のツールへの移行は、多くの場合、設定フォーマットの変換を意味します。

スキーマ検証ワークフロー

JSON Schemaツールはより成熟しています。一般的なパターン:可読性のためにYAMLで設定を作成し、検証のためにJSONに変換します。

APIとのデータ交換

内部ツールはYAML設定を使用し、外部APIはJSONを必要とする場合があります。

よくある質問

YAMLはJSONのスーパーセットですか?

はい。YAML 1.2はJSONの厳格なスーパーセットです——有効なJSONドキュメントはすべて有効なYAMLです。

設定ファイルにYAMLよりJSONを選ぶ理由は?

YAMLはJSONにないコメントをサポートします。YAMLは深くネストされた構造にも対してコンパクトです。

TOMLとは何ですか?いつ使うべきですか?

TOMLは設定ファイル向けに設計されており、明確なINIスタイルの構文と明示的な型を持っています。Rust(Cargo.toml)とPython(pyproject.toml)の標準です。

JSONからYAMLへの変換で情報が失われますか?

まれです。JSONはほとんどのパーサーでキーの順序を保持します。YAMLはJSONに相当するものがないアンカーとタグをサポートします。

JSONの出力に'undefined'が表示される原因は?

JSON.stringifyは配列内のundefined値をnullに変換し、オブジェクトから省略します。

YAMLファイルでJSONを使用できますか?

はい。YAMLはJSONのスーパーセットなので、YAMLドキュメント内にJSON構文を直接埋め込むことができます。