YAML简介

YAML是”YAML Ain't markup language"(YAML不是一种标记语言)的缩写,是一种对人类设计友好(方便读写)的数据序列化语言,可以很好地与其它编程语言协同完成日常任务。

它是JSON的一个严格超集,在语法上增加了类似Python的换行和缩进。不过,与Python不同,YAML不允许使用Tab缩进。

基本规则

YAML有一些基本的规则,用来避免与各种编程语言和编辑器相关的歧义问题,这些基本的规则使得无论哪个应用程序或软件库都能一致地解析YAML。

  • 文件名以.yaml结尾
  • 大小写敏感
  • 不允许使用Tab。由于Tab的支持性不够普通,因此使用空格。

基本数据类型

YAML的基本数据类型与JSON一致,字符串、数字等标量类型,List、Map等容器类型。

YAML擅长处理映射表(哈希表 / 字典)、序列(数组 / 列表)和标量(字符串 / 数字)。

标量

最基础的数据类型,包括布尔值、数字、字符串。

integer: 25
string: "25"
float: 25.0
boolean: Yes

序列

列表或者数组。每个item一行,以-开头。

- Cat
- Dog
- Goldfish

同一层级的item是一个序列,可以用缩进来表示多层的序列。

-
  - Cat
  - Dog
  - Goldfish
-
  - Python
  - Lion
  - Tiger

可以是多层的:

-
 -
  - Cat
  - Dog
  - Goldfish

也可以这么写:

--- Cat
  - Dog
  - Goldfish

映射表

键值对,如:

animal: pets

如果值是一个序列:

pets:
  - Cat
  - Dog
  - Goldfish

5分钟教程

--- # 文档开头

# YAML注释类似这样

################
#    标量类型   #
################

# 根对象是一个map,相当于其它语言中的dictionary、hash或者object。
key: value
another_key: Another value goes here.
a_number_value: 100
scientific_notation: 1e+12

# 数字1会被解析为数值类型,而不是布尔类型。如果希望被解析为布尔类型,请使用`true`
boolean: true
null_value: null
key with spaces: value

# 字符串不需要使用引号,不过可以使用。
however: 'A string, enclosed in quotes.'
'Keys can be quoted too.': "Useful if you want to put a ':' in your key."
single quotes: 'have ''one'' escape pattern'
double quotes: "have many: \", \0, \t, \u263A, \x0d\x0a == \r\n, and more."
# UTF-8/16/32的字符需要编码
Superscript two: \u00B2

# 多行字符串可以写作"literal block"(用'|')或者"folded block"(用'>')
literal_block: |
    整块文本都是'literal_block'的值,换行会被保留。

    只要缩进的文本都包含在block中,首缩进会被去除。
    
        多余的缩进会被保留 - 此行文字会缩进4个空格。
        
folded_style: >
    整块文本都是`folded_style`的值,不过所有的换行会被替换为一个。
    
    上面的空行会被转换为一个换行符。
    
        多余的缩进依然会保留其换行 -
        此段文字会展示为两行。
        
####################
#      容器类型     #
####################

# 嵌套使用缩进。推荐使用2个空格的缩进(但不是必须的)。
a_nested_map:
  key: value
  another_key: Another Value
  another_nested_map:
    hello: hello
    
# Map的key可以是非字符串
0.25: a float key

# Key可以是复杂对象,像多行对象一样,我们使用问号后跟一个空格来表示复杂Key的开始。
? |
  This is a key
  that has multiple lines
: and this is its value

# YAML还允许使用复杂Key语法在序列之间进行映射
# 某些语言的解析器可能会有警告
? - Manchester United
  - Real Madrid
: [2001-01-01, 2002-02-02]

# 序列(List、Array等)这样表示
# (注意,'-'算作缩进)
a_sequence:
  - Item 1
  - Item 2
  - 0.5  # 序列可以包含不同的类型
  - Item 4
  - key: value
    another_key: another_value
  -
    - This is a sequence
    - inside another sequence
  - - - Nested sequence indicators
      - can be collapsed
      
# YAML是JSON的严格超集,因此可以使用JSON风格的map和序列
json_map: {"key": "value"}
json_seq: [3, 2, 1, "takeoff"]
and quotes are optional: {key: [3, 2, 1, takeoff]}

#######################
#    YAML的额外特性    #
#######################

# YAML有一个方便特性“anchor",可以方便地在文档中重复内容。以下两个key对应的值相同:
anchored_content: &anchor_name This string will appear as the value of two keys.
other_anchor: *anchor_name

# Anchor可以用来重复/继承属性
base: &base
  name: Everyone has same name

# 正则表达式 << 称作Merge Key Language-Independent Type,
# 表示将一个或多个map的所有key插入到当前map

foo: &foo
  <<: *base
  age: 10

bar: &bar
  <<: *base
  age: 20

# foo和bar都会包含name: Everyone has same name

# YAML还支持tag,用来显式地声明类型。
explicit_string: !!str 0.5 # 指明字符串类型
# 某些解析器实现了语言相关的tag,比如Python的复杂数值类型
python_complex_number: !!python/complex 1+2j

# 语言相关的tag可以与复杂key一起使用
? !!python/tuple [5, 7]
: Fifty Seven
# 在Python中值为{(5, 7): 'Fifty Seven'}

####################
#   YAML的额外类型  #
####################

# YAML不仅可以理解字符串和数字这样的基本类型,
# 也可以理解ISO格式的日期和时间字面量。
datetime: 2001-12-15T02:59:43.1Z
datetime_with_spaces: 2001-12-14 21:59:43.10 -5
date: 2002-12-14

# !!binary这个tag表示一个base64编码的二进制对象
gif_file: !!binary |
  R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
  OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
  +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
  AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=

# YAML也支持集合类型:
set:
  ? item1
  ? item2
  ? item3
or: {item1, item2, item3}

# 集合其实是值为null的map;上面的写法等同于:
set2:
  item1: null
  item2: null
  item3: null

...  # 文档结尾
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • YAML是”YAML Ain't markup language"(YAML不是一种标记语言)的缩写,是一种对人类...
    光明自在阅读 3,522评论 0 1
  • 简介 YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易...
    柱柱007阅读 657评论 0 0
  • 简介 数据结构 1. 对象 也可以写成: 较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个...
    上山走18398阅读 913评论 0 0
  • 什么是yamlYAML是"YAML Ain't a Markup Language"(YAML不是一种置标语言)的...
    jackcooper阅读 6,893评论 0 16
  • 信息标记的三种形式 信息的标记 信息在传递的过程中都需要加以标记,可通过标签的方式,比如HTML,也可以通过键值对...
    3D打印老A阅读 2,487评论 0 2