はじめに
Ruby、Groovy、Pythonといった動的言語や、Ruby on Railsなどの関連フレームワークの話題が花ざかりの昨今ですが、この記事をお読みくださっているJava開発者の中には、普段の仕事では純粋なJavaしか使わず、今後も当分はその状況が続くという方も多いことでしょう。しかしそれでも、目新しい知識や技術を身に付けたり、自らの開発に役立てたりということは可能なはずです。
この記事では、YAMLというファイル形式について紹介します。YAMLとは「YAML Ain't Markup Language」の略で、Ruby on Railsフレームワークの設定ファイルに採用されたことで広く知られるようになりました。ここでは、YAMLの概要と、XMLやJSONとの違いについて見ていき、その利点と弱点を探っていきます。
スペースによるインデントとJSON風表記
YAMLでは、スペースによるインデントを使ってデータの階層構造を示す表記方法が基本です。XMLのようなタグのネストや、JSONのような中かっこ({}
)と角かっこ([]
)による表記ではありません。ただしYAMLは、JSONのスーパーセットでもあります。そのため、必要に応じて、スペースによるインデント表記からJSON風の表記へと切り替えることも可能です。YAMLの発案者たちはYAMLのことを、「すべてのプログラミング言語のための、人に優しいデータシリアライゼーション方式の標準」だと言っています。私の経験では、「人に優しい」ことを重視した点が、YAMLならではの大きな特徴です。
スペースによるインデントを用いた、純粋なYAMLの例を見てみましょう。YAMLファイルを作成するときには、スペースの幅が重大な意味を持つので、固定幅のフォントを使うことが大事です(補足説明「YAMLとタブ」を参照)。
JFrame: defaultCloseOperation: JFrame.EXIT_ON_CLOSE title: Test Frame width: 800 height: 400 components: - JTextArea: name: textArea1 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 - JButton: name: button2 text: Button 2
次の例のように、必要に応じて途中からJSON風の表記に切り替え、インデントによる表記と混在させることも可能です。
JFrame: defaultCloseOperation: JFrame.EXIT_ON_CLOSE title: Test Frame width: 800 height: 400 components: - JTextArea: name: textArea1 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 - JButton: {name: button2, text: Button 2} #JSON syntax
JSON風の表記への切り替えは、最下位レベルのノード(子供がないノード)で行うのが特に好都合です。また、上の例にもあるように、シャープ記号(#
)を使うことで、YAMLファイルの中にコメントを記述できます。
スペースのインデントを用いたファイル形式でよく見られるのが、タブがどのように解釈されるかという問題です。YAMLの場合、答えは簡単で、ファイル内でタブは一切サポートされていません。スペースの代わりにタブを用いてインデントすると、処理時に例外が発生します。