yaml介绍
YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。
文件格式
多行缩进
数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 12345
字串不一定要用双引号标识;
在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
允许在文件中加入选择性的空行,以增加可读性;
在一个档案中,可同时包含多个文件,并用“——”分隔;
选择性的符号“…”可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)。
单行缩写
YAML也有用来描述好几行相同结构的数据的缩写语法,数组用’[]‘包括起来,hash用’{}'来包括。因此,上面的这个YAML能够缩写成这样:
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }
使用方法
首先引入yaml的jar ,如果是maven项目,则需要在pom.xml文件中添加
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.23</version>
</dependency>
代码示例
public class YmlUtil {
protected String yml = null;
private Logger logger = LogManager.getLogger(YmlUtil.class);
public YmlUtil(String yml) {
this.yml = yml;
}
public Object getYml(String path) {
Yaml yaml = new Yaml();
URL url = YmlUtil.class.getClassLoader().getResource(yml);
if (url != null) {
Map map;
try {
map = (Map) yaml.load(new FileInputStream(url.getFile()));
return getValue(map, path);
} catch (FileNotFoundException e) {
logger.info("can not find the yml file, please double check");
return null;
}
} else {
return null;
}
}
@SuppressWarnings("rawtypes")
public static Object getValue(Map map, String value) {
String[] values = value.split("\\.");
Map m = map;
int len = values.length - 1;
for (int i = 0; i < len; i++) {
if (m.containsKey(values[i])) {
m = (Map) m.get(values[i]);
} else {
return null;
}
}
return m.get(values[len]);
}
}