YAMLとは

YAML概要

YAMLとは

YAML(YAML Ain't Markup Language:ヤムル)とは、構造化されたデータを表現するためのフォーマット(データ記述形式)です。

YAMLは可読性や取り扱いの容易性があり、設定ファイルやログファイル、データ交換用フォーマットなどの定型化データを記述することに適しています。


シリアライゼーション(serialization)について

YAMLはシリアライゼーションのためのデータ形式として頻繁に用いられます。

シリアライゼーション(シリアライズ)とは、プログラムが内部で扱っているデータをファイルへ書き出したり、ネットワーク送受信できるようにデータ形式を変換することです。

なお、シリアライズされたデータをソフトウェアで扱うことのできるデータ形式に復元することを「デシリアライズ」と言います。


YAML記法の基本

データ形式

YAMLでは基本的に「シーケンス」、「マッピング」、「スカラ」の3種類の形式の組み合わせとしてデータを記述します。

シーケンス(sequence) データを連続に並べた構造(多くのプログラミング言語で「配列」「リスト」などと呼ばれるデータ構造)
マッピング(mapping) キーと値のペアを列挙する構造(多くのプログラミング言語で「ハッシュ」「連想配列」などと呼ばれるデータ構造)
スカラ(scalar) 単体のデータ

※シーケンスやマッピングのようにデータを格納するデータ型を「コレクション (Collection)」といい、それ以外のデータ型を「スカラ (Scalar)」といいます。


コメント

コメントは「#」記号を用います。

行末までコメントアウトされます。なお、範囲コメントはありません。


# コメント行
- element1  # コメント行
- element2  # コメント行

YAMLファイルにおける定義文の最終行を定義する場合には「...」と記述します。


- element1  # 読み込む
...
- element2  # 以降の定義は読み込まれない

表記法

YAMLの表記法にはブロックスタイルとフロースタイルの2種類があります。

これらを併用することも可能です。


# ブロックスタイル
- name: user01
  pass: passwd01
- name: user01
  pass: passwd02

# フロースタイル
- [ {name: user03, pass: passwd03}, {name: user04, pass: passwd04} ]

インデント

YAMLでは、スペースによるインデントを使ってデータの階層構造を表現します。

なお、ファイル内でタブの記述は一切サポートされていません。スペースの代わりにタブを用いてインデントすると、処理時に例外が発生します。


コレクションの記法

シーケンスやマッピングのように、他のデータを入れるようなデータ型を「コレクション (Collection)」といいます。


シーケンス(配列)について

YAMLにおけるシーケンス(配列)は「- 値」で表します。

3つの要素を配列に格納する場合には以下のように記述します。


- element1
- element2
- element3

スペース文字でインデントすることで、配列のネストを表現します。

なお、ネストは配列の要素を明示する必要があるため、単純に箇条書きすることはできません。


- element1
-
  - element2-1
  - element2-2
-
  - element3-1
  - element3-2

マッピング(ハッシュ)について

YAMLにおけるマッピング(ハッシュ)は「キー: 値」で表します。


key1: value1
key2: value2

スペース文字でインデントすることで、マッピングのネストを表現します。


key1:
  key1-1: value1
  key1-2: value2
key2:
  key2-1: value3
  key2-2: value4

シーケンス(配列)とマッピング(ハッシュ)

ハッシュと配列は併用して相互にネストすることができます。

配列の中にハッシュを定義する場合には以下のように記述します。


- name: user01
  pass: passwd01
- name: user01
  pass: passwd02

ハッシュの中に配列を定義する場合には以下のように記述します。


username:
  - admin
  - user01
group:
  - admin
  - users

スカラの記法

数値データ型


decimal1: 255          # 10 進数
decimal2: 2,048,000    # 10 進数 (コンマで桁区切りを表記することが可能です)
octal:    0377         # 8 進数
hexa:     0xFF         # 16 進数
float:    0.255        # 浮動小数点

boolデータ型

bool値として、「true/false」、「yes/no」、「on/off」を記述することができます。


bool1: true  # 真
bool2: false # 偽
bool3: yes   # 真
bool4: no    # 偽
bool5: on    # 真
bool6: off   # 偽

日付データ型

日付を記述する際の年月日の区切りはハイフンを使用します。


date:  2005-12-24                    # 日付
stamp: 2005-05-02 02:00:52 +09:00    # タイムスタンプ

Nullデータ型

NULLの表記は以下の2通りがあります。


null1: null  # Null 値
null2: ~     # Null 値

文字列データ型

引用符「'」や二重引用符「"」で囲むことで、強制的に文字列として扱うことができます。


str1: 'on'    # 文字列
str2: "2048"  # 文字列

複数行の文字列を記述する場合には、「|」記号を指定してから文字列を記述します。


text1: |
  YAML Ain't Markup Language
  Yet Another Markup Language

改行文字の扱いについて、以下の指定が可能です。

| 各行の改行を保存する
|+ 各行と末尾以降の改行を保存する
|- 各行の改行は保存するが、最終行の改行は取り除く
> 改行を半角スペースに置き換える。ただし、最終行の改行は保存する
>+ 改行を半角スペースに置き換える。さらに、末尾以降の改行を保存する
>- 改行を半角スペースに置き換える。ただし、最終行の改行を取り除く

アンカー(Anchor)とエイリアス(Alias)

YAMLでは、データ参照値を用いることを定義することができます。

「&名前 参照される値」と定義しておくことで、「*名前」で参照できます。


- name: admin
  perm: &admin_perm all
- name: user01
  perm: *admin_perm
# [{"name"=>"admin", "perm"=>"all"}, {"name"=>"user01", "perm"=>"all"}]

関連ページ