Rails を触ったことのある人であれば馴染みのある、YAML データ形式の基本についてまとめました。
YAMLとは
YAML とは構造化されたデータを表現するためのデータ形式の一種です。YAML Ain't Markup Language とあるように YAML はマークアップ言語ではないと言われ、類似の規格としてJSONがあてはまります。
YAML を XML と比べると次のような利点があります。
- 読みやすい(インデントでデータの階層構造を表すため読みやすい)
- 書きやすい(XML のような終了タグが必要ない)
- わかりやすい(データを「配列」「ハッシュ」「スカラー (数値や文字列や真偽値)」だけで表す)
拡張子は*.yaml
と*.yml
の2通りありますが Rails や Ruby 方面ではほぼ*.yml
みたいです。
YAMLの書き方
YAML は主にハッシュと配列の組み合わせでデータを表現しますが、YAML の仕様ではハッシュのことをマッピング (Mapping)、配列をシーケンス (Sequence)と呼んでいます。
記述方法はブロックスタイルとフロースタイルがあり、フロースタイルで記述する場合は JSON と同じにすることができます。つまり JSON を YAML とみなすことも可能です。
ハッシュ形式
ハッシュはキー:[半角スペース]値
の形式で表します。コロンのあとに必ず半角スペースを 1 つ以上入れてください。
# ブロックスタイル name: John Smith age: 33 # フロースタイル {name: John Smith, age: 33}
ネストさせたい場合は1つ以上の半角スペースを使います。タブを使ってはいけません。
a: a1 b: b1: bbb1 b2: bbb2 c: c1
配列形式
配列は行頭に-[半角スペース]
を付けることにより配列を表現します。
# ブロックスタイル - Casablanca - Spellbound - Notorious # フロースタイル [milk, bread, eggs]
ネストさせたい場合は1つ以上の半角スペースを使います。タブを使ってはいけません。
- aaa - - bbb1-1 - bbb1-2 - - bbb3-1 - bbb3-2 - ccc
ハッシュと配列のネスト
配列の中にハッシュをネストする場合。
- name: Smith email: smith@mail.com - name: Shelton email: shelton@mail.com - name: Kelly email: kelly@mail.com
ハッシュの中に配列をネストする場合。
names: - Smith - Shelton - Kelly emails: - smith@mail.com - shelton@mail.com - kelly@mail.com
ブロックスタイルとフロースタイルの併用
記述方法のスタイルを併用することもできます。
names: [Smith, Shelton, Kelly] emails: [smith@mail.com, shelton@mail.com, kelly@mail.com] - {name:Smith, email: smith@mail.com} - {name: Shelton, email: shelton@mail.com} - {name: Kelly, email: kelly@mail.com}
スカラー(データ型)
データ型は以下の通りで基本的に自動で認識されます。文字列に変換したい時はシングルクォートかダブルクォートで囲みます。ダブルクォートで囲む場合はエスケープシーケンスを使うことが可能です。
- 文字列
- 数値 (整数, 浮動小数点)
- 真偽値 (true, yes, false, no)
- Null値 (null, ~)
- 日付 (yyyy-mm-dd, yyyy-mm-dd hh:mm:ss [+-]hh:mm)
複数行の文字列
改行を含む文字列の場合、何も指定しないと改行が認識されずスペースに変換されます。そこで|(パイプ)
と>(大なり記号)
を使うことによって改行を含めるか否かを指定できます。
# 改行が全てスペースに変換される description: hoge fuga bar # 改行を保持する。|+ で最終行に続く次の改行も保持、|- で最終行の改行も削除 description: | hoge fuga bar # 改行が半角スペースに置き換わる。>+ で最終行に続く次の改行も保持、>- で最終行の改行も削除 description: > hoge fuga bar
データの区切り
---
は一つのファイル内に複数のYAMLドキュメントを埋め込むときに用いるセパレータです。
--- name: Smith email: smith@mail.com --- name: Shelton email: shelton@mail.com --- name: Kelly email: kelly@mail.com
...
を使用するとそれ以降は読み込まれません。
name: Smith email: smith@mail.com ... name: Shelton email: shelton@mail.com
コメント
#
はコメント行を表します。範囲コメントはありません。