Java使用snakeyaml解析yaml

YAML

Yaml是一種「是一個可讀性高而且容易被人類閱讀,容易和腳本語言交互,用來表達資料序列的編程語言。」相似於XML但比XML更簡潔,語法詳見
http://www.ruanyifeng.com/blog/2016/07/yaml.html
在JAVA中也有相關的類庫能夠進行解析YAMLhtml

準備工做

這裏使用gradle加入依賴java

compile 'org.yaml:snakeyaml:1.17'

以後就能夠使用了編程

load

先上代碼編程語言

@Test
    public void load() throws FileNotFoundException{
        //初始化Yaml解析器
        Yaml yaml = new Yaml();
        File f=new File("test.yaml");
        //讀入文件
        Object result= yaml.load(new FileInputStream(f));
        System.out.println(result.getClass());
        System.out.println( result);
    }
----test.yaml---
a: 1
b: 2
----輸出---
class java.util.LinkedHashMap
{a=1, b=2}

這裏load方法支持String,InputStream,Reader做爲輸入ide

loadall

在一個yaml文件中能夠存入多組配置並使用loadAll進行讀取,多組之間使用三個橫槓分開gradle

@Test
    public void loadall() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        File f = new File("test.yaml");
        Iterable<Object> result = yaml.loadAll(new FileInputStream(f));
        for (Object obj : result) {
            System.out.println(obj.getClass());
            System.out.println(obj);
        }
    }
----test.yaml---
a: 1
b: 2
---
c: 3
----輸出---
class java.util.LinkedHashMap
{a=1, b=2}
class java.util.LinkedHashMap
{c=3}

這裏返回的是一個Iterable,每一個對象的解析是在遍歷到的時候進行的是懶加載的this

java對象

snakeyaml還支持普通java類型的讀取code

@Test
    public void loadPojo() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        File f = new File("test.yaml");
        Map result= (Map) yaml.load(new FileInputStream(f));
        System.out.println(result);
        System.out.println(result.get("pojo"));
        System.out.println(result.get("pojo2"));
    }
public class Pojo {
    public String name;
    public Pojo(String name){
        this.name=name
    }
    @Override
    public String toString(){
        return "name->"+name;
    }
}
----test.yaml---
pojo: !!yaml.Pojo {name: name}
pojo2: !!yaml.Pojo [ name]

這裏簡單定義了一個pojo而後在配置文件中有兩種方式第一種(使用大括號{})是經過變量名進行賦值,第二種(使用方括號[])是經過構造方法進行賦值htm

dump

同時還支持將對象反向編譯成yaml配置對象

@Test
    public void dump() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        Pojo p=new Pojo();
        p.name="name";
        System.out.println( yaml.dump(p));
    }
----輸出---
!!yaml.Pojo {name: name}

Yaml配置

上面使用的都是YAML的無參構造方法,其實YAML在構造方法中還有能夠配置參數
主要有以下4個

constructor

用於配置構造對象的建立過程

representer

用於配置yaml文件中對應tag響應解析成的對象
Representer representer = new Representer();
representer.addClassTag(Car.class, new Tag("!car"));//這裏!car就會使用Car類型來解析,而不須要再配置文件中寫全car的包名
representer.addClassTag(Wheel.class, Tag.MAP);//會使用Wheel對map的類型進行解析

dumpoption

這個是在dump時,控制輸出的寬度,對齊,類類型等相關信息

resolver

用於隱式識別對應類型,只要符合了對應的pattern就會使用對應的tag進行解析
yaml.addImplicitResolver(new Tag("!dice"), Pattern.compile("\d+d\d+"), "123456789");

alias merge

yaml支持別名引用(&用於起別名 *用於引用),以及merger(<<:)

- &anchor
  boolean: true
  integer: 3
- <<: *anchor
  integer: 7
----輸出---
[{boolean=true, integer=3}, {integer=7, boolean=true}]

能夠看到第二個map自動merge了應用的boolean而integer覆蓋了原來的值3

備註

參考官方文檔:https://bitbucket.org/asomov/snakeyaml/wiki/Documentation

相關文章
相關標籤/搜索