アプリケーションで使うデータを保存するフォーマットとして、XMLやJSONが有名ですが、最近では人間が読みやすく手書きできるという特性を持つYAMLもかなり普及してきました。
とはいうものの、Webでググって出てくる記事は、細かい説明は記載されているものの、パツとみて大枠を理解するには難しい感が有ります。
そこで本記事では、細かいことは抜きして、まず大枠を理解すると共に、これだけ知っていれば普通に使いこなせる内容を厳選して、解説しています。
YAMLとは
YAML(YAML Ain't Markup LanguageまたはYAML Ain't a Markup Language)は、データの表現と交換のための人間が読み書きしやすいテキストベースのデータ形式です。
YAMLはXMLやJSONよりも後に登場した形式ではありますが、最近ではなく、2001年に最初にリリースされており、XMLとJSONに代わる人間が読みやすく、記述が簡潔なデータ形式として開発されました。
YAMLは主に設定ファイルやデータのシリアライゼーション(=ストレージへの保存)、構造化された文書の表現に使用されています。
YAMLのフォーマット
YAMLではキーと値のペアが基本的な構成要素です。キーと値はコロン(:)+半角スペースで区切ります。また、値はスカラー値(文字列、数値、真偽値)、配列、連想配列(=辞書、マップ)などが使用できます。
| スカラー | 文字列、数値、true、false、null、.nan、.inf などの単一の値。 文字列はダブルクォートで囲んでも、囲まなくても良い。 |
| 配列 | 先頭がハイフン(-)+半角スペースで始める。 (例) - 要素1 配列を入れ子にする場合、ハイフン(-)+半角スペースを横に並べる。 (例) - - 要素1 |
| 連想配列(=辞書、マップ) | キーと値を(:)+半角スペースで区切って記述する。 (例) key: 値 辞書を入れ子にする場合、キーの横に値は書かず、改行を行った後で 更にインデントを付ける。 (例)key: key: 値 |
YAMLの記載順序については、仕様上特に規定されていませんので、使用する言語やライブラリによって、記載順に取り出せるか否かが変わってきます。
例えば、YAMLの記載順に画面項目を自動生成するような場合、必ずしも記述順にならない可能性があります。
書き方のサンプル
YAMLのルールに則った具体例を示しておきます。
name: yamada
age: 36
tel:
- 080-3333-5555
- 080-3333-6666
- - 56723
- 58223
- 72358
address:
post code: 213-2356
country: japan
city:
area1: shibuya
area2: odaiba
landmark:
- Hachiko Statue
- Tokyo Tower
- Odaiba Statue
スカラー
スカラー型はキーに対して1つの値を持つもので、単純な連想配列として取得できます。コロン(:)の後に半角スペースを入れる必要があります。
name: yamada
age: 36
enable: true
tel-no: 123-4567
文字列についてはダブルクォートで括る必要はありませんが、括っても構いません。
name: yamada
name: "yamada"
配列
連想配列のキーに対して、値を配列として持たせるものです。ハイフンと値の間には半角スペースを入れる必要があります。
tel:
- 080-3333-5555
- 080-3333-6666
配列を入れ子にすることも可能です。
tel:
- 080-3333-5555
- 080-3333-6666
- - 56723
- 58223
- 72358
配列は定義した順番に取り出すことが可能なので、定義順を保証したい場合は配列で定義しましょう。
連想配列(=辞書、マップ)
連想配列のキーに対して、値に連想配列を持たせたものです。
address:
post code: 213-2356
country: japan
連想配列を入れ子にする場合は次のように記述します。
address:
post code: 213-2356
country: japan
city:
area1: shibuya
area2: odaiba
使用できない文字
YAMLに記述する文字の中には、次の様に使えない文字があります。
| 使えない文字 | 説明 |
|---|---|
| \ | エスケープシーケンスの開始 |
| : | キーと値の区切り |
| , | 配列要素の区切り |
| - | ハッシュ要素の区切り |
| ... | データの終了 |
| # | コメント |
| 改行 | 改行を保持しない |
| & | 配列要素の参照 |
| * | ハッシュ要素の参照 |
| ! | 特殊な意味を持つ文字 |
また、記述する位置によってエラーにならず使える場合もあります。使用するライブラリによりますが、例えば *は1行目がエラーになりますが、2行目は正しく読み込めることもあります。
data: *123
name: 123*
コメント
#を付けるとコメントとして扱われます。ただし、プログラムでYAMLを読み書きする場合、読み込みは問題ありませんが、プログラムに保存している情報をYAMLに書き込む場合、ライブラリの多くはコメントの出力に対応していません。
従って、プログラムで編集した内容を元のYAMLに保存する場合、コメント行が削除されてしまう可能性があるのでご注意ください。
# アドレス帳
name: yamada #名前
age: 36 #年齢
tel:
- 080-3333-5555
- 080-3333-6666
まとめ
今回はYAMLの書き方について解説しました。C#やPythonなどの言語によっては、多少ルールに従わなくても問題なく読み込めるかもしれません。
例えば、キーと値の間はコロンと半角スペースで区切りますが、Pythonの場合はコロンだけでも問題なく読めてしまいます。
異なる言語(もしくは使用するライブラリ)で作ったプログラム間で、 YAMLを介してデータの受け渡しを行う場合、Pythonは問題なく通るのにC#側でエラーになるなど、予期せぬ事態が発生する可能性があります。ちょっとした記述ミスでエラーになりますので、その点はご注意ください。

コメント