YAML 语言教程

日期: 2016年7月 4日

编程免不了要写配置文件,怎么写配置也是一门学问。

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。

本文介绍 YAML 的语法,以 JS-YAML 的实现为例。你可以去在线 Demo 验证下面的例子。

一、简介

YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。

它的基本语法规则如下。

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

# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

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

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

以下分别介绍这三种数据结构。

二、对象

对象的一组键值对,使用冒号结构表示。

: pets

转为 JavaScript 如下。

{ animal: 'pets' }

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

: { name: Steve, foo: bar }

转为 JavaScript 如下。

{ hash: { name: 'Steve', foo: 'bar' } }

三、数组

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

- Cat
- Dog
- Goldfish

转为 JavaScript 如下。

[ 'Cat', 'Dog', 'Goldfish' ]

数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。

-
 - Cat
 - Dog
 - Goldfish

转为 JavaScript 如下。

[ [ 'Cat', 'Dog', 'Goldfish' ] ]

数组也可以采用行内表示法。

: [Cat, Dog]

转为 JavaScript 如下。

{ animal: [ 'Cat', 'Dog' ] }

四、复合结构

对象和数组可以结合使用,形成复合结构。

:
 - Ruby
 - Perl
 - Python
websites:
 YAML: yaml.org
 Ruby: ruby-lang.org
 Python: python.org
 Perl: use.perl.org

转为 JavaScript 如下。

{ languages: [ 'Ruby', 'Perl', 'Python' ],
  websites:
   { YAML: 'yaml.org',
     Ruby: 'ruby-lang.org',
     Python: 'python.org',
     Perl: 'use.perl.org' } }

五、纯量

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

  • 字符串
  • 布尔值
  • 整数
  • 浮点数
  • Null
  • 时间
  • 日期

数值直接以字面量的形式表示。

: 12.30

转为 JavaScript 如下。

{ number: 12.30 }

布尔值用true和false表示。

: true

转为 JavaScript 如下。

{ isSet: true }

null用~表示。

: ~

转为 JavaScript 如下。

{ parent: null }

时间采用 ISO8601 格式。

: 2001-12-14t21:59:43.10-05:00

转为 JavaScript 如下。

{ iso8601: new Date('2001-12-14t21:59:43.10-05:00') }

日期采用复合 iso8601 格式的年、月、日表示。

: 1976-07-31

转为 JavaScript 如下。

{ date: new Date('1976-07-31') }

YAML 允许使用两个感叹号,强制转换数据类型。

: !!str 123
f: !!str true

转为 JavaScript 如下。

{ e: '123', f: 'true' }

六、字符串

字符串是最常见,也是最复杂的一种数据类型。

字符串默认不使用引号表示。

: 这是一行字符串

转为 JavaScript 如下。

{ str: '这是一行字符串' }

如果字符串之中包含空格或特殊字符,需要放在引号之中。

: '内容: 字符串'

转为 JavaScript 如下。

{ str: '内容: 字符串' }

单引号和双引号都可以使用,双引号不会对特殊字符转义。

: '内容\n字符串'
s2: "内容\n字符串"

转为 JavaScript 如下。

{ s1: '内容\\n字符串', s2: '内容\n字符串' }

单引号之中如果还有单引号,必须连续使用两个单引号转义。

: 'labor''s day'

转为 JavaScript 如下。

{ str: 'labor\'s day' }

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

: 这是一段
  多行
  字符串

转为 JavaScript 如下。

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

多行字符串可以使用|保留换行符,也可以使用>折叠换行。

: |
  Foo
  Bar
that: >
  Foo
  Bar

转为 JavaScript 代码如下。

{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }

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

: |
  Foo

s2: |+
  Foo

s3: |-
  Foo

转为 JavaScript 代码如下。

{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

字符串之中可以插入 HTML 标记。

: |

  <p style="color: red">
    段落
  </p>

转为 JavaScript 如下。

{ message: '\n<p style="color: red">\n  段落\n</p>\n' }

七、引用

锚点&和别名*,可以用来引用。

: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

等同于下面的代码。

:
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  adapter:  postgres
  host:     localhost

test:
  database: myapp_test
  adapter:  postgres
  host:     localhost

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

下面是另一个例子。

- &showell Steve
- Clark
- Brian
- Oren
- *showell

转为 JavaScript 代码如下。

[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

八、函数和正则表达式的转换

这是 JS-YAML 库特有的功能,可以把函数和正则表达式转为字符串。

.yml
fn: function () { return 1 }
reg: /test/

解析上面的 yml 文件的代码如下。

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

try {
  var doc = yaml.load(
    fs.readFileSync('./example.yml', 'utf8')
  );
  console.log(doc);
} catch (e) {
  console.log(e);
}

从 JavaScript 对象还原到 yaml 文件的代码如下。

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

var obj = {
  fn: function () { return 1 },
  reg: /test/
};

try {
  fs.writeFileSync(
    './example.yml',
    yaml.dump(obj),
    'utf8'
  );
} catch (e) {
  console.log(e);
}

九、参考链接

    时间: 2024-10-13 14:07:27

    YAML 语言教程的相关文章

    sql语言教程

    sql语言循序渐进教程目录: 介绍SQL 表的基础知识 数据检索 创建表 插入数据到表 删除表 更新记录 删除记录 SELECT语句 合计函数 GROUP BY子句 HAVING子句 ORDER BY子句 组合条件和布尔运算符 IN 和 BETWEEN 条件运算符 数学运算符 JOIN子句 索引 DISTINCT和排除复制 Aliases .In以及子查询 更多的子查询 EXISTS 和 ALL UNION 和 外部连接 嵌入SQL

    photoshop动作自动化脚本语言教程

    自动化对每个设计师的工作来说是很有用的.它可以在重复的任务上节省宝贵的时间,还能够帮我们更快捷.更容易的解决一系列问题. 你可以使用photoshop的动作来使工作流程自动化,这是很流行的,大多数人都知道并且已经在使用的方法.今天,我们将介绍给你一种高级的自动化技巧:脚本语言.所有的这一切仅仅需要你有一点点关于JavaScript的基本知识,这对于我们中的一些网页设计师往往都是具备的. 我很多年前就知道Photoshop的脚本语言,但是我几个月前才开始决定研究它.我忽视了它是因为我认为那是聪明的

    Rust语言教程(1) - 一门没有GC的语言

    缘起 本来这一系列文章并不在计划中.昨天跟赵磊和七哥讨论没有GC管理内存的问题. 讨论到没有GC情况下管理内存的学习曲线,七哥认为学习曲线不陡而是使用曲线陡.诚然,如果只有malloc和free,确实还是学习容易使用难的.到了C++引用了new和delete之后,学习曲线也还算是平和的,因为后面还有auto_ptr, 自动引用计数,右值引用和std::move等一大堆要学习的慢慢地增加进来.多线程的情况下,还会有更复杂一些的问题. 但是这比起Rust语言来,学习曲线都要好一些,因为大不了是mem

    iphone6调节Siri声音性别和语言?ios8调节Siri声音性别和语言教程

    第1步:我们在iphone6 中点击"设置-通用-Siri" 点击进入,细节如下图所示 第2步:不管是想调整男声女声还是想调整下语言,在相应的选项界面中点选即可.  

    语言教程学堂:hibernate缓存机制详细分析

    在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: /** * 此时会发出一条sql,将30个学生全部查询出来 */ List<Student> ls =

    yaml在python上的使用教程详解

    YAML是一种容易人类阅读.适合表示程序语言的数据结构.可用于不同程序间交换数据.支持泛型工具.支持串行处理.丰富的表达能力和可扩展性.易于使用的语言.YAML利用缩进或者是explicit indicatior(如{})来表示属性的嵌套,更为直观和simple. 一.YAML的格式 YAML的格式及特点如下: YAML使用可打印的Unicode字元,可使用UTF-8或UTF-16.使用空白字元为文件缩排来表示结构:不过不能使用跳格字元(TAB).注解由井字号( # )开始,可以出现在一行中的任

    自动化运维工具ansible的使用详细教程_服务器其它

    一.ansible简介 1.ansible ansible是新出现的自动化运维工具,基于Python研发.糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能.仅需在管理工作站上安装ansible程序配置被管控主机的IP信息,被管控的主机无客户端.ansible应用程序存在于epel(第三方社区)源,依赖于很多python组件.主要包括: (1).连接插件connection plugins:负责和被监控端实现通信: (2).host inventory:指定操

    SQL语言概述

    SQL语言是一种用于和关系数据库进行交互通信的计算机语言.当用户想检索数据库中的数据时,就可以用SQL语言发出此请求,DBMS对SQL请求进行处理,检索到所要求的数据,并将其返回给用户.这个向数据库请求并得到数据的过程称为数据库查询,这就是SQL语言(Structure Query Language)这一名称的由来.如今,SQL语言已不仅仅是一个查询工具,它已成为可以对关系数据库中的数据进行组织.管理和检索的主要工具. 现在,SQL用于控制DBMS提供给用户的所有功能,SQL语言已成为用户与基于

    SQL语言语句

    在讲述sql语言之前,我们先定义一个小型销售公司关系数据库的内容,该数据库所包含的关系表有: ▲OFFICE表.该表的列有:OFFICE,CITY,REGION,MGR,TARGET和SALES:分别表示销售处编号,销售处所在的城市名,销售处所在的地区名,销售处经理编号,销售处的目标和销售处的销售额. ▲SALESREPS表.该表的列有:EMPL--NUM,NAME,AGE,REP_OFFICE,TITLE,HIRE_DATE,MANAGER,QUOTA和SALES:分别表示销售处名称,雇佣日期