速成 YAML 指南
什么是 YAML?
YAML 是一个数据序列化的标准,适用于所有开发语言,最大的特点是可读性好
YAML 的一个主要应用方向就是编写配置文件,有非常多的系统和框架采用YAML进行配置
示例
title : yaml test
date : 2016/08/06
content : hello yaml
这就是一个最简单的YAML文件,非常好理解
YAML 对比 XML/JSON
从示例可以看出 YAML 和 XML/JSON 比较类似,那么他们的关系是什么呢?
XML由大量标签构成,YAML则轻便很多,但没有DTD概念,不能像XML那样验证数据格式
对于YAML和XML,可以简单的理解为:
XML很啰嗦,YAML简洁清晰,好理解,但XML的啰嗦也是有好处的,便于验证数据
YAML中也是支持JSON格式的,例如
Button: {name: button2, text: Button 2}
但YAML比JSON的可读性更好,例如
arr :
- a:
a1 : 1
a2 :
- 2
- 3
- b
比较好理解,arr 是一个数组,有 a 和 b 两个元素,其中 a 又包含两个元素,a2 是一个数组
JSON格式是这样的
{
arr: [
{
a: {
a1: 1,
a2: [2, 3]
}
},
'b'
]
}
大量的 {} 与 [] 嵌套很容易让人看不清楚
除了比JSON更好读,YAML还有更多的功能,后面介绍语法时可以看到
如何使用 YAML?
--JS
<script src="esprima.js"></script>
<script src="js-yaml.min.js"></script>
<script type="text/javascript">
var doc = jsyaml.load('greeting: hello');
</script>
--Node.js
yaml = require('js-yaml');
fs = require('fs');
try {
var doc = yaml.safeLoad(fs.readFileSync('/home/example.yml', 'utf8'));
console.log(doc);
} catch (e) {
console.log(e);
}
--JAVA
JYaml库的官方示例
date: 11/29/2005
receipts:
- store: ken stanton music
category: entertainment
description: saxophone repair
total: 382.00
- store: walmart
category: groceries
total: 14.26
映射关系
解析代码
Entry entry = Yaml.loadType(
new File("ReceiptEntry.yml"), Entry.class);
YAML 基础语法
需要注意的是,YAML使用空格进行缩进,表达上下级关系,所以空格不是用来美化代码的,而是语法的一部分
对象
name : YAML
解析为JS对象:
{ name: 'YAML' }
User :
name : Bill
age : 30
解析为JS对象:
{ User: { name: 'Bill', age: 30 } }
数组
- a
- b
- c
解析为JS对象:
[ 'a', 'b', 'c' ]
items:
- id: 1
price: 1.1
- id: 2
price: 2.2
解析为JS对象:
{ items:[
{ id: 1, price: 1.1 },
{ id: 2, price: 2.2 }
] }
字符串
字符串可以不使用引号,直接写
str : hello world
如果包含特殊字符(如 :),就要放在引号中
str : '包含: abc'
字符串可以写成多行,换行符会被解析为空格,如
str: 我
是
谁
解析为JS对象:
{ str: '我 是 谁' }
如果想保留换行符,需要使用符号 '|'
str: |
我
是
谁
解析为JS对象:
{ str: '我\n是\n谁\n' }
多行字符串末尾的换行符可以选择保留或者删除,例如
str1: |+
保留换行符
str2: |-
删除换行符
解析为JS对象:
{ str1: '保留换行符\n\n\n', str2: '删除换行符' }
+ 保留末尾的换行
- 删除末尾的换行
引用
sign: &sign
name: Gates
email: g@a.com
A:
content: aaa
<<: *sign
B:
content: bbb
<<: *sign
解析为JS对象:
{ sign: { name: 'Gates', email: 'g@a.com' },
A: { content: 'aaa', name: 'Gates', email: 'g@a.com' },
B: { content: 'bbb', name: 'Gates', email: 'g@a.com' } }
& 用来建立锚点(sign)
<< 表示合并到当前数据
* 用来引用锚点
强制类型转换
num: !!str 123
解析为JS对象:
{ num: '123' }
!! 表示类型转换,后面跟上要转换的类型
注释
# key: value
Block: Kiki
# 表示注释
资源推荐
YAML官网
http://www.yaml.org/
yaml-js 即时解析工具
http://nodeca.github.io/js-yaml/