言語別 YAML用ライブラリ徹底解説

第6回 Java編

この記事を読むのに必要な時間:およそ 0.5 分

今回は,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の不具合が修正される可能性は低いでしょう。

著者プロフィール

桑田誠(くわたまこと)

プログラマー。Javaに対するLL,XMLに対するYAMLなど,複雑なことをシンプルにするような技術に興味をもつ。

URLhttp://www.kuwata-lab.com/

コメント

コメントの記入