java版的yaml 解析器,试试jyaml

来源:互联网 发布:手机怎么发布淘宝宝贝 编辑:程序博客网 时间:2024/05/17 23:35

Jyaml是java版的处理yaml的类库。现在最新的版本是1.3版。使用的时候,将jar包加入classpath即可。

关于yaml
与xml进行比较可以很快看出其容易理解的文档格式化形式,在Ruby语言里面是主流的?文档格式。详细请参照:

http://yaml.org/




List的序列化和反序列化

向对象化的yaml的序列化,调用Yaml.dump方法即可。
List<String> list = new ArrayList<String>();list.add("seq1");list.add("seq2");Yaml.dump(list, new File("object.yml"));
生成了object.yml,内容如下:
--- - seq1- seq2
将上面的文件进行反序列化,使用Yaml.load方法即可:
Object obj = Yaml.load(new File("object.yml"));System.out.println(obj);
 如下的输出,可以作为List读入。
[seq1, seq2]
Map的序列化和反序列化
关于map,用法一样的;
Map<String, String> map = new HashMap<String, String>();map.put("key1", "value1");map.put("key2", "value2");Yaml.dump(map, new File("object.yml"));
object.yml生成了,内容如下:
--- key2: value2key1: value1
同样使用发序列化方法:
Object obj = Yaml.load(new File("object.yml"));System.out.println(obj);
也可以作为map进行反序列化。
{key2=value2, key1=value1}
Object的序列化和反序列化
试试如下的Person对象的序列化,序列化的对象的默认构造方法是需要的。
package etc9;public class Person {    private String name;    private int age;    public Person() {}    public Person(String name, int age) {        this.name=name;        this.age = age;    }    public String getName() { return name; }    public void setName(String name) { this.name = name; }    public int getAge() { return age; }    public void setAge(int age) { this.age = age; }}
序列化方法仍然跟上面的一样:
Person p = new Person("Thom", 33);Yaml.dump(p, new File("object.yml"));
yaml文件的输出如下:
如上的例子中,没有指定类,就会用简单的map来进行反序列化。
Person p = Yaml.loadType(new File("object.yml"), Person.class);
嵌入式的对象。
将Person作为子属性加入进去看看:
package etc9;public class Person {    private String name;    private int age;    private Person child;    ・・・    public Person getChild() { return child; }    public void setChild(Person child) { this.child = child; }}
同样的流程进行序列化
Person p = new Person("Thom", 33);p.setChild(new Person("Mick", 5));Yaml.dump(p, new File("object.yml"));
输出文件的内容如下:
--- !etc9.Personage: 33child: !etc9.Person  age: 5  name: Mickname: Thom
dump的第二个参数设定为true的话
Person p = new Person("Thom", 33);p.setChild(new Person("Mick", 5));Yaml.dump(p, new File("object.yml"), true);
就变成了如下的输出:
--- age: 33child:   age: 5  name: Mickname: Thom
反序列化同样,用下面的方法即可:
Person r = Yaml.loadType(new File("object.yml"), Person.class);
多个Object的序列化:
多个Object的序列化可以使用YamlEncoder,如果这样:
Person p1 = new Person("Thom", 33);Person p2 = new Person("Mick", 5);YamlEncoder enc = new YamlEncoder(new FileOutputStream("object.yml"));enc.writeObject(p1);enc.writeObject(p2);
enc.close();
一下的内容的文件生成:
--- !etc9.Personage: 33name: Thom--- !etc9.Personage: 5
name: Mick
拥有迭代器的集合对象的时候,可以用下面的简单的形式:
Yaml.dumpStream(collection.iterator(), file); 
反序列化用YamlDecoder ,比如下面的形式:
YamlDecoder dec = new YamlDecoder(inputStream);try {    while (true){        Object object = dec.readObject();        /* do something useful */    }} catch (EOFException e){    System.out.println("Finished reading stream.");} finally    dec.close();}
也可以这样子:
for (Object object: Yaml.loadStream(input)){    ・・・}
或者,这样子,用制定的类型:
for (Person p: Yaml.loadStreamOfType(input, Person.class)){    ・・・}
--- !etc9.Personage: 33name: Thom
反序列化使用Yaml.load,可以按etc9.Person的形式进行反序列化。
在dump方法中添加参数,如下的序列化的话,
在这种场合里面,是用对应的对象的类作为序列化的。
Person p = new Person("Thom", 33);Yaml.dump(p, new File("object.yml"), true);
就会有如下的输出:
--- age: 33name: Thom


1 0
原创粉丝点击