今回は、Java用のライブラリとして、JvYAML、JYamlの2つのライブラリを紹介します。
JvYAML
JvYAMLはRbYAMLをJavaへ移植したものであり[1]、JRubyで使われています。
インストール
https://jvyaml.dev.java.net/からjvyaml-bin-0.2.1.tar.gzをダウンロードして解凍し、lib/jvyaml.jarを適切なディレクトリにコピーしてください(リスト1)。
使い方
JvYAMLの基本的な使い方はリスト2のとおりです。YAMLドキュメントが(たとえコメントであっても)日本語を含む場合は、YAML.load(Reader)ではなくてYAML.load(String)を使うようにしてください。
タグを変更する
JvYAMLでタグを変更する方法は不明です。
日本語の扱い
読み込み(YAML.load())については、YAML.load(java.lang.String)は問題ありませんが、YAML.load(java.io.Reader)はエラーになります[2]。
書き出し(YAML.dump())については、日本語を含む文字列があるとエラーになります。解決策は今のところありません。
不具合
筆者が試したところ、以下のようなバグや制限が見つかりました。
- YAML.load()
- 循環参照しているとエラーになる(再帰的なエイリアスが解釈できない)
- 文字列をブロックスタイルで記述したとき、最終行の改行が取り除かれる
- マッピングのデフォルト値を認識しない
- YAML.dump()
- 循環参照しているデータがあるとエラーになる
- publicでないクラスのオブジェクトが復元できない
その他
もとはJRubyのために開発されたJvYAMLですが、現在のJRubyではStringのかわりにbyte配列を使うようにした「JvYAMLb」という別のライブラリが使われています。JvYAMLと違い、JvYAMLbは循環したデータも問題なく扱えますが、byte配列を使っているため日本語がまったく使えません。
作者のOla Biniは、今のところJvYAMLbのみメンテナンスしており、JvYAMLは放置されています。そのため、JvYAMLの不具合が修正される可能性は低いでしょう。
JYaml
JYamlは、Javaで書かれたYAML用ライブラリです。JvYAMLよりは致命的な不具合が少なく、また日本語も問題なく扱えるため、JvYAMLよりお勧めです。
インストール
インストールは、http://downloads.sourceforge.net/jyaml/jyaml-1.3.jarを適当なディレクトリにダウンロードするだけです。
使い方
基本的な使い方はリスト3のとおりです。
タグを変更する
Yaml.dump()でインスタンスオブジェクトをYAML文字列に変換した場合、たとえば「!com.example.Color」のようなタグがつきます。しかしこれだとJava限定になり、ほかの言語のYAMLパーサで読み込むとエラーになるため、データ交換する場合には都合が悪いです。
これを回避するには、設定ファイル「jyaml.yml」を用意し、そこにタグ名とクラス名との対応を指定します(リスト4)。このjyaml.ymlは、カレントディレクトリか、またはクラスパスで指定されたディレクトリに置いてください。
リスト5とリスト6はサンプルプログラムです。ここでは次の2つを行っています。
- 「!color」タグがついたマッピングからcom.exaple.Colorオブジェクトを復元する
- com.example.Colorオブジェクトを「!color」タグがついたYAML文字列に変換する
なお設定ファイルjyaml.ymlには、ほかにも文字コードやインデント幅などを指定できます。詳しくはJYamlのドキュメントを参照してください。
日本語の扱い
特に問題はないようです。YAMLドキュメントが日本語を含む場合、JvYAMLではYAML.load(Reader)やYAML.dump()がエラーになったのに対し、JYamlではYaml.load(Reader)もYaml.dump()も問題なく動作します。
不具合
筆者が試した限りでは次のような問題点がありました。
- Yaml.load()
- フロースタイルが正しくパースされない場合がある(リスト7)
- 正しいYAMLドキュメントでもエラーになる場合がある(リスト8)
- 未定義の名前を使ったエイリアスがあってもエラーにならない
- Yaml.loadStream()
- 入力が「---」で始まっていないと最初のドキュメントしかパースされない
- Yaml.dump()
- たとえば「!java.util.HashMap」のように、本来省略されるはずのタグが明示されることがある(リスト9)
その他
JvYAMLとJYamlを比べると、どちらも不具合が多いのですが、多少はJYamlのほうがましなようです。実際に使う場合は、動作をよく確かめてから使うようにしてください。