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"}]