YAML 基础入门

435 阅读4分钟

这是我参与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);