代码改变世界

YAML学习

2018-06-09 22:53  龙恩0707  阅读(729)  评论(0编辑  收藏  举报

YAML学习

一:什么是YAML?
YAML是专门用来写配置文件的语言,通过它来编写完成后,我们可以通过插件JS-YAML(https://github.com/nodeca/js-yaml) 来转换成我们的json数据。

二:有如下基本语法规则:

1 大小写敏感
2 使用缩进表示层级关系
3 缩进时相同层级的元素左侧对齐即可
4 使用 "#" 来表示注释。

支持的数据格式如下:

1. 对象:键值对的集合。
2. 数组:
3. 纯量;单个的,不可再分的值

2.1 对象
对象是由一组键值对组成,是使用冒号结构来表示;如下:

name: kongzhi

它会被转为如下的json数据:

{ name: 'kongzhi' }

假如我现在的项目目录如下结构:

### 目录结构如下:
demo                                        # 工程名
|   |--- index.js                                   
|   |--- index.yaml
|   |--- package.json

index.yaml 代码如下:
name: kongzhi

index.js 代码如下:

const yaml = require('js-yaml');
const fs = require('fs');

const doc = yaml.safeLoad(fs.readFileSync('./index.yaml', 'utf-8'));

console.log(doc);

执行命令 node index.js 就可以打印出
{ name: 'kongzhi' }

YAML也允许如下写法,将所有键值对写成一个行内对象;如下:

obj: { name: kongzhi, age: 30 }

转为js就变成如下:
{ obj: { name: 'kongzhi', age: 30 } }

2.2 数组:
一组以横线开头的行,构成一个数组。 如下代码:

- kongzhi
- longen
- tugenhua

转为js变为如下:
[ 'kongzhi', 'longen', 'tugenhua' ]

嵌套数组:

对数组可以嵌套数组,比如 [['kongzhi', 'longen', 'tugenhua']] 这样的。可以如下代码:

-
  - kongzhi
  - longen
  - tugenhua

对象嵌套数组:

比如如下代码:

obj:
  - kongzhi
  - longen
  - tugenhua

就会转为为成:

{ obj: [ 'kongzhi', 'longen', 'tugenhua' ] }

这样的。

数组也可以嵌套对象, 比如如下这样的:

-
  { name: kongzhi, age: 30 }

-
  name: kongzhi
  age: 30

转为js,变为如下:
[ { name: 'kongzhi', age: 30 } ]

如果多个数组的话,如下这种写法是可以的;
[
  { name: kongzhi, age: 30 },
  { name: kongzhi, age: 30 }
]

或者如下这样的:

- name: kongzhi
- name: longen0707
- name: tugenhua

就会转化成如下这样的:

[ 
  { name: 'kongzhi' },
  { name: 'longen0707' },
  { name: 'tugenhua' } 
] 

2.3 纯量
纯量是最基本的,不可再分的值,以下数据类型都属于javascript的纯量。

字符串,布尔型,整数,浮点数,Null, 时间, 日期等

1. 字符串

字符串默认不使用引号表示。如下:
str: 空智

转为js变为如下:
{ str: '空智' }

但是如果字符串中包含空格或特殊字符需要使用引号;如下所示:
str: '空智: 123'

转为js变为如下:
{ str: '空智: 123' }

如果不使用引号就会报错的

单引号中如果还有单引号,需要使用单引号进行转义,比如:
name: I am Tom's

需要写成如下:
name: 'I am Tom''s'

最后会转成 如下这样的:
{ name: 'I am Tom\'s' }

字符串也可以写成多行,从第二行开始,必须有一个单空格缩进,换行符会转换为空格。如下:

name: 这是一段
  多行
  字符串

转换成js变为如下:

{ name: '这是一段 多行 字符串' }

保留换行符 和 折叠换行

多行字符串可以使用 | 保留换行符,使用 > 折叠换行;如下代码:

name: |
  kongzhi
  longen0707
age: >
  kongzhi
  longen0707

转为js变为如下:

{ name: 'kongzhi\nlongen0707\n', age: 'kongzhi longen0707\n' }

+ 表示保留文字块末尾的换行,- 表示删除字符串末尾的换行

如下代码:

name1: |
  kongzhi

name2: |+
  longen0707



name3: |-
  tugenhua

转为js变为如下:

{ 
  name1: 'kongzhi\n',
  name2: 'longen0707\n\n\n\n',
  name3: 'tugenhua' 
}

字符串中插入HTML标记

如下代码:

name: |
  <div style="color:blue">
    xxx
  </div>

转为js变为如下:

{ name: '<div style="color:blue">\n  xxx\n</div>\n' }

2. 布尔型:
布尔值是使用true和false表示;如下代码:
isFlag: false

转换成js变为如下:

{ isFlag: false }

其中 null 使用 ~ 表示; 如下代码:
obj: ~
转为js变为如下:

{ obj: null }

3. 引用
锚点 & 和 别名 *, 可以用来引用,& 是用来建立锚点,<< 表示合并到当前数据,* 是用来引用锚点。 如下代码:

objects: &objects
  name: kongzhi
  age: 30

object2:
  name: longen0707
  <<: *objects

object3:
  name: tugenhua
  <<: *objects

转换为js变为如下:

{ 
  objects: { name: 'kongzhi', age: 30 },
  object2: { name: 'longen0707', age: 30 },
  object3: { name: 'tugenhua', age: 30 } 
}

详情demo 请看 http://nodeca.github.io/js-yaml/