アプリケーションで使うデータを保存するフォーマットとして、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のルールに則った具体例を示しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 |
使用できない文字
YAMLに記述する文字の中には、次の様に使えない文字があります。
使えない文字 | 説明 |
---|---|
\ | エスケープシーケンスの開始 |
: | キーと値の区切り |
, | 配列要素の区切り |
– | ハッシュ要素の区切り |
… | データの終了 |
# | コメント |
改行 | 改行を保持しない |
& | 配列要素の参照 |
* | ハッシュ要素の参照 |
! | 特殊な意味を持つ文字 |
また、記述する位置によってエラーにならず使える場合もあります。使用するライブラリによりますが、例えば *は1行目がエラーになりますが、2行目は正しく読み込めることもあります。
1 2 |
data: *123 name: 123* |
コメント
#を付けるとコメントとして扱われます。ただし、プログラムでYAMLを読み書きする場合、読み込みは問題ありませんが、プログラムに保存している情報をYAMLに書き込む場合、ライブラリの多くはコメントの出力に対応していません。
従って、プログラムで編集した内容を元のYAMLに保存する場合、コメント行が削除されてしまう可能性があるのでご注意ください。
1 2 3 4 5 6 |
# アドレス帳 name: yamada #名前 age: 36 #年齢 tel: - 080-3333-5555 - 080-3333-6666 |
まとめ
今回はYAMLの書き方について解説しました。C#やPythonなどの言語によっては、多少ルールに従わなくても問題なく読み込めるかもしれません。
例えば、キーと値の間はコロンと半角スペースで区切りますが、Pythonの場合はコロンだけでも問題なく読めてしまいます。
異なる言語(もしくは使用するライブラリ)で作ったプログラム間で、 YAMLを介してデータの受け渡しを行う場合、Pythonは問題なく通るのにC#側でエラーになるなど、予期せぬ事態が発生する可能性があります。ちょっとした記述ミスでエラーになりますので、その点はご注意ください。
コメント