Yet Another Markup Language
另一种标记语言
特别适合用 grep、Python、Perl、Ruby 操作
多行缩进
连续的项目通过减号 ‘ - ’ 来表示
Map结构里面的 key/value 对用冒号 ‘ : ’ 来分隔
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 610101
Tip
- 字串不一定要用双引号标识
- 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用
TAB
字符) - 允许在文件中加入选择性的空行,以增加可读性
- 在一个档案中,可同时包含多个文件,并用
---
分隔 - 选择性的符号
...
可以用来表示档案结尾(在利用串流的通讯中,这非常有用,可以在不关闭串流的情况下,发送结束讯号)
单行缩写
- 数组用
[]
- Hash用
{}
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 235011 }
适用场景
- 实现简单,解析成本很低,YAML 特别适合在脚本语言中使用
- YAML 比较适合做序列化,因为它是宿主语言数据类型直转的
- YAML 做配置文件也不错
附加 YAML 库到浏览器
<script src="/scripts/js-yaml.min.js" />
<script type="text/javascript">
var doc = jsyaml.load('greeting: hello\nname: world')
</script>
与 JSON
JSON 的语法是 YAML1.2 版的子集, JSON 文件都可以被 YAML 的剖析器剖析
YAML 的许多扩展在 JSON 是找不到的。
如:进阶资料形态、关系锚点、字串不需要双引号、映射资料形态会储存键值的顺序
与 XML和SDL
XML 和 SDL 标签概念,在 YAML 中是找不到的
安全性
YAML 是纯粹用来表达资料的语言,所以内部不会存代码注入的可执行命令
语法
- YAML 使用可打印的 Unicode 字符,可使用 UTF-8 或 UTF-16
- 使用空白字符(不能使用
Tab
)分层,同层元素左侧对齐 - 单行注解由井字号(
#
)开始,可以出现在行中任何位置 - 每个清单成员以单行表示,并用短杠+空白(
-
)起始 - 每个杂凑表的成员用冒号+空白(
:
)分开键和值 - 每个杂凑表的成员用冒号+空白(
:
)分开键和值 - 字串一般不使用引号,但必要的时候可以用引号框住
- 使用双引号表示字串时,可用倒斜线(
\
)进行特殊字符转义 - 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(使用符号
|
)或新行折叠(使用符号>
)两种方式 - 在单一档案中,可用连续三个连字号(
---
)区分多个档案 - 可选择性的连续三个点号(
...
)用来表示档案结尾(在流式传输时非常有用,不需要关闭流即可知道到达结尾处) - 重复的内容可使从参考标记星号 (
*
)复制到锚点标记(&
) - 指定格式可以使用两个惊叹号 (
!!
),后面接上名称
YAML语法示例
receipt: Oz-Ware Purchase Invoice
date: 2015-12-15
customer:
given: Dorothy
family: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
price: 100.27
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Westville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
转换成 JSON 之后
{
"receipt": "Oz-Ware Purchase Invoice",
"date": "2015-12-15T00:00:00.000Z",
"customer": {
"given": "Dorothy",
"family": "Gale"
},
"items": [
{
"part_no": "A4786",
"descrip": "Water Bucket (Filled)",
"price": 1.47,
"quantity": 4
},
{
"part_no": "E1628",
"descrip": "High Heeled \"Ruby\" Slippers",
"price": 100.27,
"quantity": 1
}
],
"bill-to": {
"street": "123 Tornado Alley\nSuite 16\n",
"city": "East Westville",
"state": "KS"
},
"ship-to": {
"street": "123 Tornado Alley\nSuite 16\n",
"city": "East Westville",
"state": "KS"
},
"specialDelivery": "Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.\n"
}
- 其中一个键值
items
,是俩个元素构成的清单,当中的俩个元素分别是包含四个 HASH 键值对的 - 使用锚点 (
&
) 和参考 (*
) 标签将bill-to
复制到了ship-to
XML和 YAML 语法格式
XML
<site>
<name>yugo</name>
<url>github.io/miyogurt</url>
</site>
YAML - Type 01
# example
---
site:
name: yugo
url: github.io/miyogurt
YAML - Type 02
# example
---
site: { name:yugo,url: github.io/miyogurt }