YAMLの基本について

スポンサーリンク

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

コメント

#はコメント行を表します。範囲コメントはありません。

参考リンク

 YAML Ain't Markup Language (YAML) Version 1.1

 Rubyist Magazine - プログラマーのための YAML 入門 (初級編)