菜单
本页目录

Yaml 语法

编程免不了要写配置文件,怎么写配置也是一门学问。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便

YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式

基本语法规则

  • 大小写敏感
  • 使用缩进表示层级关系
    • 缩进是不使用 tab 键,只允许使用空格
    • 缩进的空格数目不重要,只要相同层级左侧的元素对其即可
  • " # " 表示注释,从这个字符一直到行尾都会被解释器忽略

数据类型

对象类型:对象是一组键值对,使用冒号结构表示

name: zhangsan

hash: {name: zhangsan, age: 18}

数组类型:一组连词线开头的行,构成一个数组

- 
  - zhangsan
  - lisi
  - wangwu
  
{name: ['zhangsan', 'lisi', 'wangwu']}

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

languages   =>	['Ruby', 'Perl', 'Python']

languages:
 - Ruby
 - Perl
 - Python 

name	=>	zhangsan
name: zhangsan

website.YAML	=>	yaml.org

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

纯量:纯量是最基本的、不可再分的值

  • 字符串

    	# 字符串默认不使用引号表示		(yaml是基于UTF-8编码的)
    	str: 这是一行字符串
    
    	# 如果字符串之中包含空格或特殊字符,需要放在引号之中
    	str: '内容: 字符串'			#表示定义一个字符串为:(单引号中所有内容)
    
    	# 单引号和双引号都可以使用,双引号不会对特殊字符转义
    	s1: '内容\n字符串'			#表示定义s1为:
    											内容
    											字符串
    	s2: "内容\n字符串"			#表示定义s2为:
    											内容\n字符串
    
    
    	# 单引号之中如果还有单引号,必须连续使用两个单引号转义
    	str: '		''		' 
    			例:
    					str: ' xx let''s go '		#表示定义字符串为:xx let's go
    
    • 拓展

    	# YAML 允许使用两个感叹号,强制转换数据类型
    	e: !!str 123			#将 123 转换为 "123"
    								↑			↑
    							   数值型		字符串型
    								↓			↓
    	f: !!str true			#将 true 转换为 "true"
    
    				拓展:(注意区分数值类型,布尔值类型,字符串类型的,底层存储不一样)
    	                    数据类型
    	                        数值类型  123   12.30
    	                            123 翻译成二进制  
    
    	                        布尔值类型   true  false
    	                            true 1
    	                            false 0
    
    	                        字符串类型  今天天气真好  "123"   "true"
    	                            ['1', '2', '3']
    	                            '1' 翻译成二进制
    	                            '2' 翻译成二进制
    	                            '3' 翻译成二进制
    
    
    	# 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格(换行符会被转换为空格)
    	str: 这是一段			#定义一个字符串为: 这是一段 多行 字符串
    	  多行
    	  字符串
    
    		## { str: '这是一段 多行 字符串' }
    
    
    	# 多行字符串可以使用|保留换行符,也可以使用>折叠换行
    					| 保留换行符			#所有换行符都保留	
    					> 折叠换行			#仅保留最后一个换行符,其他的换行符转换为空格
    
    	this: |				#定义this字符串为:
    	  Foo								Foo
    	  Bar								Bar
    										|
    
    	that: >				#定义that字符串为:
    	  Foo								Foo Bar
    	  Bar								|
    
    		## { this: 'Foo\nBar\n', that: 'Foo Bar\n' }
    
    
    
    	# +表示保留文字块末尾的换行,-表示删除字符串末尾的换行
    		|+ 表示:保留所有的换行
    		|- 表示:删除所有的换行
    
    	s1: |				#定义s1字符串为:
    	  Foo							Foo
    	 								|
    	s2: |+				#定义s2字符串为:
    	  Foo							Foo
    	 								|
    	 								|
    	 								|
    	s3: |-				#定义s3字符串为:
    	  Foo							Foo
    
    
    
    		## { s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
    
    
    	# 锚点&和别名*,可以用来引用
    			锚点&:定义重复的内容
    			别名*:调用重复的内容
    													(√)
    	defaults: &defaults					=》		development:
    	  adapter:  postgres				=》		  database: myapp_development
    	  host:     localhost				=》		  adapter: postgres
    	 									=》		  host: localhost
    	development:						=》		test:
    	  database: myapp_development		=》		  database: myapp_test
    	  <<: *defaults						=》		  adapter: myapp_test
    	 									=》		  host: localhost
    	test:								=》
    	  database: myapp_test				=》
    	  <<: *defaults						=》
    
    
  • 布尔值

    	# 布尔值用 true 和 false 表示
    	isset: true
    
  • 整数

    	# 数值直接以字面量的形式表示
    	number: 12
    
  • 浮点数

    	# 数值直接以字面量的形式表示
    	number: 12.30
    
  • Null

    	# null 用 ~ 表示	
    	parent: ~ 		(表示此项为空)
    	parent:  		(表示此项为默认值)
    
  • 时间

    	# 时间采用 ISO8601 格式
    	iso8601: 2001-12-14t21:59:43.10-05:00
    
  • 日期

    	# 日期采用复合 iso8601 格式的年、月、日表示
    	date: 1976-07-31		(注意:月、日用两位数表示)