SnakeYaml快速入门
更新时间:2018-06-02 | 阅读量(2,203)
【原创文章,转载请注明原文章地址,谢谢!】
在YAML快速入门[https://www.jianshu.com/p/97222440cd08]中,我们已经简单介绍了YAML的语法,本节中主要介绍YAML的配置读取。
目前有很多可以生成和解析YAML的第三方工具,常见的,如SnakeYaml,jYaml,Jackson等,但是不同的工具功能还是差距较大,比如jYaml就不支持合并(<<)和(---)操作。我们下面来看看Springboot使用的SnakeYaml的基本使用方式。
###简介
SnakeYaml是一个完整的YAML1.1规范Processor,支持UTF-8/UTF-16,支持Java对象的序列化/反序列化,支持所有YAML定义的类型(map,omap,set,常量,具体参考http://yaml.org/type/index.html)。
###快速使用
要使用SnakeYaml,首先引入maven依赖:
org.yaml
snakeyaml
1.17
我们来完成一个最简单的yaml解析例子:
@Test
public void testLoad() {
String yamlStr = "key: hello yaml";
Yaml yaml = new Yaml();
Object ret = yaml.load(yamlStr);
System.out.println(ret);
}
结果输出:
{key=hello yaml}
简介解释:
1,使用Yaml类,创建一个Yaml对象,所有的解析操作都是从这个对象开始;
2,声明了一个yaml的字符串(当然也可以使用yaml文档等),定义了一个对象:key: hello yaml;
3,使用Yaml对象的load方法 public Object load(String yaml)加载一段yaml字符串,返回解析之后的对象;
我们通过打印ret的类型:
System.out.println(ret.getClass().getSimpleName());
可以看到,实际创建的是一个Map:LinkedHashMap。
###load/loadAll/loadAs 方法使用
Yaml的load方法可以传入多种参数类型:
public Object load(String yaml)
public Object load(InputStream io)
public Object load(Reader io)
三个方法都是通过传入的不同类型的内容,解析得到结果对象。需要注意一点的是,SnakeYaml通过读入的内容是否包含BOM头来判断输入流的编码格式。如果不包含BOM头,默认为UTF-8编码。
下面再来看一个解析案例,这次使用yaml文件的方式。首先创建一个yaml文件:
#test.yaml
- value1
- value2
- value3
很明显结果应该是一个List集合,把该文件放到resources下:
@Test
public void testType() throws Exception {
Yaml yaml = new Yaml();
List
ret = (List)yaml.load(this.getClass().getClassLoader()
.getResourceAsStream("test.yaml"));
System.out.println(ret);
}
打印结果:
[value1, value2, value3]
如果需要加载的yaml文件中包含多个yaml片段,则可以使用loadAll方法加载所有的yaml内容。比如有如下一个yaml文件:
#test2.yaml
sample1:
r: 10
sample2:
other: haha
sample3:
x: 100
y: 100
这个yaml文件内容很明显是一个对象(或者map),对象的每一个属性对应的又是一个对象。要加载这个yaml文件,代码应该是:
@Test
public void test2() throws Exception {
Yaml yaml = new Yaml();
Map ret = (Map) yaml.load(this
.getClass().getClassLoader().getResourceAsStream("test2.yaml"));
System.out.println(ret);
}
打印结果:
{sample1={r=10}, sample2={other=haha}, sample3={x=100, y=100}}
如果我们稍微修改一下test2.yaml文件:
---
sample1:
r: 10
---
sample2:
other: haha
---
sample3:
x: 100
y: 100
按照YAML规范,这应该是三个yaml配置片段了。那么如果再使用上面的代码解析,就会报错:

可以看到,load方法无法处理---标记。
这种时候只能使用loadAll方法解析:
public Iterable