YAML 基础

  • 简介
  • 对象
  • 数组
  • 常量
  • 引用

1.  简介

YAML 是专门用来写配置文件的语言,非常简洁和强大!

它的基本语法规则有:

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用 Tab 键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;

YAML 中使用 # 作为注释, Yaml 中只有行注释。

YAML 支持的数据结构有三种:

  • 对象: 键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary);
  • 数组: 一组按次序排列的值,又称为序列(sequence) / 列表(list);
  • 常量:单个的,不可再分的值;

2. YAML  对象

对象的一组键值对,使用冒号结构表示,格式为 key: value,冒号后面要加空格。

animal: pets

同时,YAML 也允许另一种写法,即将所有键值对写成一个行内对象。

hash: { name: dog, age: 1}

可以使用缩进来表示层级关系,如:

key:
  value: dog
  age:  24

properties 相当于 key.value = dog, key.age = 24 。

3. 数组

一组连词线开头的行,构成一个数组。

lover:
  - Cat
  - Dog
-
  - Cat
  - Dog
  - Goldfish

properties 相当于 lover = [ Cat, Dog] , [ [Cat, Dog, Goldfish] ]。

相对复杂的例子,如:

companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W

表示,companies 属性是一个数组,每一个数组元素由 id, name, price 三个属性构成。

使用流式的方式表示,即为:

companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]

4. 常量

常量是最基本的、不可再分的值。以下数据类型都属于 Yaml 的常量:

  • 整数
  • 浮点数
  • 字符串
  • NULL
  • 日期
  • 布尔
  • 时间
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

关于常量中的字符串要注意的是:

  • 字符串默认不使用引号表示;
  • 如果字符串之中包含空格或特殊字符,需要放在引号之中;
  • 单引号和双引号都可以使用,双引号不会对特殊字符转义;
  • 单引号之中如果还有单引号,必须连续使用两个单引号转义;
  • 多行字符串可以使用 | 保留换行符,也可以使用 > 折叠换行:
this: |
Foo
Bar
that: >
Foo
Bar

  属性转换为:  { this: 'Foo\nBar\n', that: 'Foo Bar\n' } 。

5. 引用

重复的内容在 YAML 中可以使用 & 来完成锚点定义,使用 * 来完成锚点引用,例如:

hr:
- Mark McGwire
- &SS Sammy Sosa
rbi:
- *SS
- Ken Griffey

在 hr 中,使用 &SS 为 Sammy Sosa 设置了一个锚点(引用),名称为 SS,在 rbi 中,使用 *SS 引用了该锚点,那么结果为:

{rbi=[Sammy Sosa, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}

也可定义成如下结构:

SS: &SS Sammy Sosa
hr:
- Mark McGwire
- *SS
rbi:
- *SS
- Ken Griffey

注意,不能独立的定义锚点,比如不能直接这样写: &SS Sammy Sosa;另外,锚点能够定义更复杂的内容,比如:

default: &default
- Mark McGwire
- Sammy Sosa
hr: *default

hr 相当于引用了 default 的数组,注意,hr: *default 要写在同一行。

合并锚点可以将一个锚点内容直接合并到一个对象中,如:

merge:
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
sample1:
<<: *CENTER
r: 10
sample2:
<< : [ *CENTER, *BIG ]
other: haha
sample3:
<< : [ *CENTER, *BIG ]
r: 100

在 merge 中,定义了四个锚点,分别在 sample 中使用。
sample1 中,<<: *CENTER意思是引用 {x: 1,y: 2},并且合并到 sample1 中,那么合并的结果为:sample1={r=10, y=2, x=1} 。

sample2中,<<: [*CENTER, *BIG] 意思是联合引用 {x: 1,y: 2} 和 {r: 10},并且合并到sample2中,那么合并的结果为:sample2={other=haha, x=1, y=2, r=10} 。

sample3中,引入了 *CENTER, *BIG,还使用了 r: 100 覆盖了引入的 r: 10,所以 sample3 的值为:sample3={r=100, y=2, x=1} 。

再举一例:

defaults: &defaults
adapter: postgres
host: localhost development:
database: myapp_development
<<: *defaults test:
database: myapp_test
<<: *defaults

相当于:

defaults:
adapter: postgres
host: localhost development:
database: myapp_development
adapter: postgres
host: localhost test:
database: myapp_test
adapter: postgres
host: localhost

& 用来建立锚点 (defaults),<< 表示合并到当前数据,* 用来引用锚点。

有了合并锚点,就可以在配置中,把相同的基础配置抽取出来,在不同的子配置中加以合并引用。

参考文章:

YAML 1.2 官网教程: https://yaml.org/spec/1.2/spec.html

YAML 在线格式化校验工具: http://www.bejson.com/validators/yaml/
JSON 在线解析: https://c.runoob.com/front-end/53
 

YAML 基础的更多相关文章

  1. YAML基础知识及搭建一台简洁版guestbook

    一,前言 前面我们已经搭建过简易版k8s集群了,在此基础上可以搭建一个简洁版guestbook ,以便来学习k8s创建pod的整个过程. 二,在此之前,我们还需要学习一下YAML基础知识 YAML 基 ...

  2. springboot的yaml基础语法与取值,配置类,配置文件加载优先级

    1.基本语法k:(空格)v:表示一对键值对(一个空格必须有):以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是同一个层级的属性和值也是大小写敏感: server: port: 8081 pat ...

  3. YAML基础教程

    一.YAML介绍YAML参考了其他多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822.Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt ...

  4. YAML基础语法

    正如YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言.YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读. 一边学习规则 ...

  5. [Kubernetes]yaml文件详解

    应前一段时间夸下的海口:[Kubernetes]如何使用yaml文件使得可以向外暴露服务,说过要写一篇关于yaml文件详解的文章出来的,今天来总结一下.yaml文件用在很多地方,但是这里以介绍在Kub ...

  6. Kubernetes之YAML文件

    一.YAML 基础 YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便.它实质上是一种通用的数据串行化格式.后文会说明定义YAML文件创建Pod和创建Deployment. YA ...

  7. yaml中的锚点和引用

    项目引入yaml语言来写配置文件,最近发现利用其锚点&和引用*的功能,可以极大减少配置文件中的重复内容,将相同配置内容收敛到锚点处,修改时,只需要修改锚点处的内容,即可在所有引用处生效. ya ...

  8. 碰到的一个新的东西——yaml,果然是个好东西

    yaml 基础语法可以看阮一峰大大的博客[yaml 语言教程] 看过了 xml 和 json之后,看一眼这个 yaml,觉得少写了好多东西,不用再去找层级关系了, yaml 直接一目了然,没有了尖括号 ...

  9. python之读取yaml数据

    一.yaml简介 yaml:一种标记语言,专门用来写配置文件. 二.yaml基础语法 区分大小写: 使用缩进表示层级关系: 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元素 ...

随机推荐

  1. C 标准库 中 操作 字符串 的 代码

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...

  2. Java中如何判断一个字符串是否为数字

    方法一:异常处理 public static boolean isInteger(String str){ try { Integer i = Integer.parseInt(str); retur ...

  3. 书单list

    2018年对我来说是个踩到狗屎的一年,不能说运气差,只能说过去所有的不良决策后果都集中到2018年爆发了,希望新的一年,都好起来.书单很短,买的确实很多,真的惭愧. 昨日世界 南渡北归 上学记 回忆录 ...

  4. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  5. UIImage指定区域自由拉伸

    UIImage的 resizableImageWithCapInsets 可以指定需要拉伸的位置,这个方法很有用,可以减少长短按钮数量

  6. Request和Response中文乱码问题的解决方案和区分

    首先,在刚接触这个中文乱码问题的时候,还是比较混乱的,因为针对request和response各自都有自己的解决方案,而且思路相似,方法也很相似,又针对get和post两种提交方式,分两种解决中文乱码 ...

  7. django中对数据库的增删改查

    Django的配置文件时settings.py中的 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplate ...

  8. [Doctrine Migrations] 数据库迁移组件的深入解析四:集成diff方式迁移组件

    场景及优势 熟悉Symfony框架之后,深刻感受到框架集成的ORM组件Doctrine2的强大之处,其中附带的数据迁移也十分方便.Doctrine2是使用Doctrine DBAL组件把代码里面的表结 ...

  9. redis学习指南

    一.redis安装 # 安装最新版 yum install -y epel-release vim atop htop net-tools git wget gcc-c++ yum clean all ...

  10. Java实例 Part4:数组及其常用操作

    目录 Part4:数组及其常用操作 Example01:将二维数组的行列交换 Example02:使用选择排序法对数组进行排序 Example03:使用冒泡排序法对数组进行排序 Example04:使 ...