YAMLとは?
YAML (YAML Ain’t Markup Language) とは、構造化されたデータを表現するためのフォーマットのことです。
次のような用途で使うのに向いているフォーマットとなっています。
- 各種設定ファイル
- データ保存用 (シリアライゼーション)
- データ交換用フォーマット
- ログファイル
使用目的は「XML」と似ているのですが、XMLに比べてYAMLは読みやすい、書きやすい、わかりやすいといった利点があります。
- 読みやすさ:インデントを使ってデータの階層構造を表現
- 書きやすさ:終了タグが必要ない
- わかりやすさデータを「配列」「ハッシュ」「スカラー (数値や文字列や真偽値)」だけで表すため理解・記述しやすい
■記述例 --- # プログラミング言語、ブロック形式 - Java - Python - Ruby --- # 買い物リスト、インライン形式、またはフロー形式 [Java, Python, Ruby]
「#」は行コメントで「—」は、1つのファイル内に複数のYAMLドキュメントを埋め込むときに用いるセパレータとなっています。
連想配列で記述する場合は、下記の通りです。
--- # ブロック name: Potepan Style age: 30 --- # インライン {name: Potepan Style, age: 30}
YAMLはあくまで「仕様」であるため、YAMLを処理するライブラリの「実装」が必要です。
なお、XMLに関しては下記の記事で詳しく解説しています。
【関連記事】
▶︎JavaでXMLを読み込みする方法を解説!概要や出力方法も合わせて紹介
YAMLのファイル構造の構成要素
YAMLのファイル構造でよく使用する構成要素として、ハッシュ・リスト・ブロックリテラルの3つを紹介します。
【ハッシュ】
インデントした子で、キーと値をコロン(:)で区切って表記すると、ハッシュを作成できます。
JFrame: defaultCloseOperation: JFrame.EXIT_ON_CLOSE title: Sample Frame width: 800 height: 400
中かっこ({})を使ってJSON風の表記によるハッシュも作成可能です。
キーと値の各ペアはカンマで区切ります。
JFrame: {defaultCloseOperation: JFrame.EXIT_ON_CLOSE, title: Sample, Frame, width: 800, height: 400}
【リスト】
リストは、YAMLの基礎となる機能です。
リストを作成するには、リストの各要素の先頭に(-)を付け、スペースのインデントと組み合わせて記述しましょう。
- Java - Python - Ruby
角かっこ([])を使った、JSON風の表記によるリストも作成可能です。
[Java, Python, Ruby]
【ブロックリテラル】
ブロックリテラルは、YAMLファイルの中に大量のテキストを簡単に記述可能です。
縦棒(|)のディレクティブを使った場合、テキスト内の改行は保持されます。
XMLやその中でCDATAを使ったときの、見にくい表記とは一線を画しているのが特徴です。
text: | This is a really long text that spans multiple lines (but preserves new lines). It does not need to be escaped with special brackets, CDATA tags, or anything like that
YAMLプロセッサは、最初の行の先頭文字から後をテキストとみなし、テキスト内の改行をすべて保持します(その前のインデントのスペースは無視します)。
一方、大なり記号(>)のディレクティブを使った場合、改行はすべて無視され、1行の長いテキストとみなされます。
text: > This is a really long text that spans multiple lines (but preserves new lines). It does not need to be escaped with special brackets, CDATA tags, or anything like that
この2つの他に、縦棒とプラス記号(|+)のディレクティブ(先行するスペースは削除し、改行と後続のスペースは保持)や、(>-)のディレクティブ(すべてのスペースを削除)などがあります。
YAMLのライブラリについて
JavaのYAMLライブラリには、主に次の4種類があります。
- SnakeYAML:https://bitbucket.org/asomov/snakeyaml/wiki/Documentation
- JYaml:http://jyaml.sourceforge.net/index.html
- YamlBeans:https://github.com/EsotericSoftware/yamlbeans
- jackson-dataformat-yaml:https://github.com/FasterXML/jackson-dataformat-yaml
この中でも、下記のような理由でよく利用されるのが「SnakeYAML」です。
- ドキュメントわかりやすい
- 機能が豊富に揃っている
- Spring Beans、Spring Boot、PlayといったJavaやScalaの有名フレームワークを使用
JavaでYAMLの読み込み
SnakeYAMLで外部ファイル読み込むサンプルコードは下記の通りです。
■記述例(person.yaml) !!sample.Person name: Yuichi age: 26 father: !!sample.Person name: Hiroshi age: 54 mother: !!sample.Person name: Yumi age: 53
■記述例(Person.java) package sample; public class Person { protected String name; protected int age; protected Person father; protected Person mother; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setFather(Person father) { this.father = father; } public void setMother(Person mother) { this.mother = mother; } }
■記述例(SetupPerson.java) package sample; import org.yaml.snakeyaml.Yaml; public class SetupPerson { public Person normalSetup() { Person person = new Person(); person.setName("Yuichi"); person.setAge(26); Person father = new Person(); person.setName("Hiroshi"); person.setAge(54); Person mother = new Person(); person.setName("Yumi"); person.setAge(53); person.setFather(father); person.setMother(mother); return person; } public Person yalmSetup() { return (Person) new Yaml().load(getClass().getResourceAsStream("person_fixtures.yaml")); } }