这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
YAML 是一种较为人性化的数据序列化语言,可以配合目前大多数编程语言使用。
YAML 的语法比较简洁直观,特点是使用缩进的方式来表达层次结构
YAML 多应用于编写配置文件,其文件一般以 .yml 或.yaml为后缀
编写规则
- 大小写敏感
# 下面两个是不同的
name: klaus
Name: klaus
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
# YAML
info:
name: klaus
firend:
name: Alex
age: 18
- 使用
#表示注释,-
从这个字符一直到行尾,都会被解析器忽略
-
也就是
yaml只支持单行注释
-
# 我是注释
- 支持流式风格( Flow style)的语法(用花括号包裹,用逗号加空格分隔,类似 JSON)
- 也就是
yaml文件是原生可以支持json格式
# yaml是可以正常解析 json格式的内容
{
"name": "Klaus",
"age": 23
}
我们可以这个测试平台查看yaml编译为js对象的结果 或 使用这个测试平台查看yaml编译后为json的结果
对象
# 对象 --- 冒号后面要加一个空格
# 对象键值对使用冒号结构表示 key: value,
# key: value
name: Klaus # => { name: 'Klaus' }
# ----------------------------------
# 对象嵌套
# 写法1
info :
name: Klaus
# => { info: { name: 'Klaus' } }
# 写法2
# 支持流式风格
info : { name: Klaus } # => { info: { name: 'Klaus' } }
info: {
name: Klaus,
age: 23
}
# => { info: { name: 'Klaus', age: 23 } }
# 写法4 --- 问号加一个空格代表一个复杂的 key
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
# => 'complexkey1,complexkey2': [ 'complexvalue1', 'complexvalue2' ] }
数组
# 数组
# 一组以区块格式(Block Format)(即“破折号+空格”)开头的数据组成一个数组
- Cat
- Dog
- Fish
# => [ 'Cat', 'Dog', 'Fish' ]
-
- Cat
- Dog
- Fish
# => [ [ 'Cat', 'Dog', 'Fish' ] ]
# 支持内联格式(Inline Format)来表达(用方括号包裹,逗号加空格分隔,类似 JSON)
[ Cat, Dog, Fish ] # => [ 'Cat', 'Dog', 'Fish' ]
# 就一个-, 不写数组值的时候,默认有一个值为null
# 可以认为yaml没有undefined,所以其默认会使用null来填充
- # => [ null ]
纯量
纯量(字面量)是最基本的,不可再分的值
boolean:
- true # true,True, TRUE 皆可
- false # false,False, FALSE 皆可
string:
# 可以使用双引号或者单引号包裹特殊字符 --- 推荐不加引号
- Klaus # => klaus, 'klaus', "Klaus" 皆可
# 如果有特殊符号的时候,需要使用引号进行包裹
- 'name: Klaus' # => 'name: Klaus'
- Klaus Wang # => 'Klaus Wang'
#字符串可以拆成多行,每一行会被转化成一个空格
- Klaus
Wang # => 'Klaus Wang'
number:
# 和js中number一样,可以是整数,也可以是浮点数
- 10 # => 10, 0.1, 12.5 皆可
# 支持二进制,八进制,十六进制 (进制标识必须全小写 即需要写成0o, 0x, 0b ...)
- 0b11000 # => 0o30, 0x18 皆可
- 0B11000 # => '0B11000' 如果进制标识符写成了大写,那么会被识别为字符串
# 十六进制中除进制标识外的字母不区分大小写
- 0x1A # 0x1a 和 0x1A 的转换结果是一样
- 6.8523015e+5 #可以使用科学计数法
# yaml中没有undefined 这个数据类型
# 使用 ~ 表示的是null
# null、Null、NULL 和 ~ 都是空,不指定值默认也是空
null: ~
# 对象不写值的时候,默认值是null
name: # => { name: null }
#日期必须使用ISO 8601格式,即 yyyy-MM-dd
date:
- 2018-02-17
#时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
datetime:
- 2018-02-17T15:02:31+08:00
YAML 允许使用两个感叹号(双感叹号+目标类型),强制转换数据类型
e: !!str 123
f: !!str true
# => { e: '123', f: 'true' }
锚点
defaults: &defaults # 设置锚点
adapter: postgres
host: localhost
adapter: *defaults # 使用锚点
human: &base # 添加名为 base 的锚点
body: 1
hair: 999
singer:
<<: *base # 引用 base 锚点,实例化时会自动展开
skill: sing # 添加额外的属性
- &showell Steven
- Clark
- Brian
- Oren
- *showell
# => [ 'Steven', 'Clark', 'Brian', 'Oren', 'Steven' ]
js-yaml
js-yaml 是一个可以解析yml文件,并将其转换为JavaScript对象的库
安装
npm install js-yaml
使用
const yaml = require('js-yaml');
const fs = require('fs');
const doc = yaml.load(fs.readFileSync('./foo.yml', 'utf8'));
console.log(doc);