今回は、
JvYAML
JvYAMLはRbYAMLをJavaへ移植したものであり
Webサイト | https:// servlets/ |
---|---|
バージョン | 0. |
ドキュメント | なし |
作者 | Ola Bini |
インストール
https://
$ 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ドキュメントが
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.
dump() - 循環参照しているデータがあるとエラーになる
- publicでないクラスのオブジェクトが復元できない
その他
もとはJRubyのために開発されたJvYAMLですが、
作者のOla Biniは、
JYaml
JYamlは、
インストール
インストールは、
使い方
基本的な使い方はリスト3のとおりです。
import java.util.*;
import java.io.*;
import org.ho.yaml.Yaml;
public class JYamlExample1 {
public static void main(String[] args) throws IOException {
/// YAMLドキュメントを読み込む
InputStream inputStream =
args.length > 0 ? new FileInputStream(args[0]) : System.in;
Reader reader = new InputStreamReader(inputStream, "UTF-8");
reader = new BufferedReader(reader);
Object ydoc = Yaml.load(reader); // Yaml.load(String)も可
System.out.println(ydoc);
/// YAMLストリームを読み込む
/// (最初が「---」で始まってる必要がある)
reader = new FileReader("example.yaml");
for (Object ydoc2: Yaml.loadStream(reader)) {
System.out.println(ydoc2);
}
reader.close();
/// 任意のデータをYAML文字列に変換する
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 101);
map.put("name", "どれみ");
List<Map> list = new ArrayList<Map>();
list.add(map);
map.put("self", map);
System.out.println(Yaml.dump(list));
}
}
タグを変更する
Yaml.
これを回避するには、
transfers:
color: com.example.Color
リスト5とリスト6はサンプルプログラムです。ここでは次の2つを行っています。
- 「!color」
タグがついたマッピングからcom. exaple. Colorオブジェクトを復元する - com.
example. Colorオブジェクトを 「!color」 タグがついたYAML文字列に変換する
import java.util.*;
import java.io.*;
import org.ho.yaml.Yaml;
public class JYamlExample2 {
public static void main(String[] args) throws IOException {
/// 「!color」タグがついたデータを読み込む
String input = "- !color {red: 255, green: 128, blue: 0}\n";
Object ydoc = Yaml.load(input);
System.out.println(ydoc);
/// 実行結果(com.example.Colorオブジェクトが生成される):
/// [com.example.Color@ce5b1c]
/// com.example.ColorオブジェクトをYAML文字列に変換する
com.example.Color color = new com.example.Color(255, 128, 1);
System.out.print(Yaml.dump(color));
/// 実行結果(「!color」タグが使われる):
/// --- !color
/// blue: 1
/// green: 128
/// red: 255
}
}
package com.example;
public class Color {
private int red, green, blue;
public Color() { };
public Color(int r, int g, int b) {
setRed(r);
setGreen(g);
setBlue(b);
}
public int getRed() { return red; }
public void setRed(int r) { red = r; }
public int getGreen() { return green; }
public void setGreen(int g) { green = g; }
public int getBlue() { return blue; }
public void setBlue(int b) { blue = b; }
}
なお設定ファイルjyaml.
日本語の扱い
特に問題はないようです。YAMLドキュメントが日本語を含む場合、
不具合
筆者が試した限りでは次のような問題点がありました。
- Yaml.
load() - フロースタイルが正しくパースされない場合がある
(リスト7) - 正しいYAMLドキュメントでもエラーになる場合がある
(リスト8) - 未定義の名前を使ったエイリアスがあってもエラーにならない
- フロースタイルが正しくパースされない場合がある
- Yaml.
loadStream() - 入力が
「---」 で始まっていないと最初のドキュメントしかパースされない
- 入力が
- Yaml.
dump() - たとえば
「!java. util. HashMap」 のように、 本来省略されるはずのタグが明示されることがある (リスト9)
- たとえば
# { null: {x: 10, y: 20}} と解釈されてしまう
{x: 10, y: 20}
# 'End of document expected'という例外が発生する
- &m1
foo
- bar
- !java.util.HashMap
y: 20
x: 10
その他
JvYAMLとJYamlを比べると、