今回は,Java用のライブラリとして,JvYAML,JYamlの2つのライブラリを紹介します。
JvYAML
JvYAMLはRbYAMLをJavaへ移植したものであり(注1),JRubyで使われています。
JvYAMLについて
| Webサイト | https://jvyaml.dev.java.net/ servlets/ProjectDocumentList |
|---|---|
| バージョン | 0.2.1 |
| ドキュメント | なし |
| 作者 | Ola Bini |
- 注1
- RbYAML自体はPyYAMLをRubyへ移植したものです。
インストール
https://jvyaml.dev.java.net/からjvyaml-bin-0.2.1.tar.gzをダウンロードして解凍し,lib/jvyaml.jarを適切なディレクトリにコピーしてください(リスト1)。
リスト1 JvYAMLのインストール
$ wget --no-check-certificate https://jvyaml.dev.java.net/files/documents/5215/41454/jvyaml-bin-0.2.1.tar.gz $ tar xzf jvyaml-bin-0.2.1.tar.gz $ cd jvyaml-0.2.1/ $ cp lib/jvyaml.jar $HOME
使い方
JvYAMLの基本的な使い方はリスト2のとおりです。YAMLドキュメントが(たとえコメントであっても)日本語を含む場合は,YAML.load(Reader)ではなくてYAML.load(String)を使うようにしてください。
リスト2 JvYAMLの使い方(JvYAMLExample1.java)
import java.util.*;
import java.io.*;
import org.jvyaml.YAML;
public class JvYAMLExample1 {
public static void main(String[] args) throws IOException {
/// YAMLドキュメントを読み込む
/// (日本語を含まないのであれば
/// Reader reader = new FileReader("example.yaml");
/// Object ydoc = YAML.load(reader);
/// でもよい)
InputStream inputStream =
args.length > 0 ? new FileInputStream(args[0]) : System.in;
Reader reader = new InputStreamReader(inputStream, "UTF-8");
reader = new BufferedReader(reader);
StringBuffer buf = new StringBuffer();
int ch;
while ((ch = reader.read()) >= 0)
buf.append((char)ch);
reader.close();
Object ydoc = YAML.load(buf.toString());
System.out.println(ydoc);
/// YAMLストリームを読み込む
reader = new FileReader("example.yaml");
List ydocs = YAML.loadAll(reader);
reader.close();
System.out.println(ydocs);
/// 任意のデータをYAML文字列に変換する
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 101);
map.put("name", "Foo");
List<Map> list = new ArrayList<Map>();
list.add(map);
System.out.println(YAML.dump(list));
}
}
タグを変更する
JvYAMLでタグを変更する方法は不明です。
日本語の扱い
読み込み(YAML.load())については,YAML.load(java.lang.String)は問題ありませんが,YAML.load(java.io.Reader)はエラーになります(注2)。
書き出し(YAML.dump())については,日本語を含む文字列があるとエラーになります。解決策は今のところありません。
- 注2
- たとえ日本語が現れるのがコメントのみであってもエラーになります。
不具合
筆者が試したところ,以下のようなバグや制限が見つかりました。
- YAML.load()
- 循環参照しているとエラーになる(再帰的なエイリアスが解釈できない)
- 文字列をブロックスタイルで記述したとき,最終行の改行が取り除かれる
- マッピングのデフォルト値を認識しない
- YAML.dump()
- 循環参照しているデータがあるとエラーになる
- publicでないクラスのオブジェクトが復元できない
その他
もとはJRubyのために開発されたJvYAMLですが,現在のJRubyではStringのかわりにbyte配列を使うようにした「JvYAMLb」という別のライブラリが使われています。JvYAMLと違い,JvYAMLbは循環したデータも問題なく扱えますが,byte配列を使っているため日本語がまったく使えません。
作者のOla Biniは,今のところJvYAMLbのみメンテナンスしており,JvYAMLは放置されています。そのため,JvYAMLの不具合が修正される可能性は低いでしょう。

