文章目錄
隨着軟件開發的需要,接觸到了許多的配置文件都樂意使用YAML文件來做配置文件,爲了工作需要,學習和了解YAML的語法是非常必要。 YAML是一種數據序列化語言,有些類是於JSON,因爲這種語言對格式要求嚴格,又是以數據本身爲中心的語言,所以很適合做配置文件。文件後綴名以 .yaml 和 .yml 爲後綴名。這裏將對這種語法進行簡單的介紹。
這裏使用JSON來說明YAML的含義
使用工具是YAML和JSON互轉的工具(網站鏈接)
注意:
- YAML區分大小寫。
- YAML在創建YAML文件時不允許使用製表符,只允許使用空格。
- YAML同級排首對齊(一般2/4個空格)
- YAML鍵值以冒號+空格分開(例如:key: value)
一、縮進和註釋
對於縮進,YAML只有三點要求:
1、只能使用空格
2、同級排首對齊
3、鍵值以冒號+空格分開
註釋使用#進行單行註釋,YAML不支持多行註釋
例如:
YAML:
#正規格式
a: b
c:
- c1
- c2
d:
key1: value1
key2: value2
---
#值格式錯位,但是格式滿足要求依然正確
c:
- c1
- c2
d:
key1: value1
key2: value2
JSON:
//正規格式
{
"a": "b",
"c": [
"c1",
"c2"
],
"d": {
"key1": "value1",
"key2": "value2"
}
}
//值格式錯位,但是格式滿足要求依然正確
{
"c": [
"c1",
"c2"
],
"d": {
"key1": "value1",
"key2": "value2"
}
}
二、鍵值對、對象、map、list
YMAL:
a: value1 #鍵值對
b: #對象
name: Name
age: 12
map: #map
key1: value1
key2: value2
list: #簡單數組
- 12
- 13
- 14
objectlist: #對象數組
-
name: name1
age: 12
-
name: name2
age: 13
? #複雜對象,表示key是一個數組,值也是數組,當然對象也可以
- key1
- key2
:
- value1
- value2
JSON:
{
"a": "value1",
"b": {
"name": "Name",
"age": 12
},
"map": {
"key1": "value1",
"key2": "value2"
},
"list": [
12,
13,
14
],
"objectlist": [
{
"name": "name1",
"age": 12
},
{
"name": "name2",
"age": 13
}
],
"[\"key1\", \"key2\"]": [
"value1",
"value2"
]
}
YAML中還支持流式(flow)語法表示對象,比如上面例子可以寫爲:
a: value1 #鍵值對
b: {name: Name,age: 12} #對象
map: {key1: value1,key2: value2} #map
list: [12,13,14] #簡單數組
objectlist: [{name: name1,age: 12},{name: name2,age: 13}] #對象數組
[key1,key2] : [value1,value2] #複雜對象,表示key是一個數組,值也是數組,當然對象也可以
JSON:
{
"a": "value1",
"b": {
"name": "Name",
"age": 12
},
"map": {
"key1": "value1",
"key2": "value2"
},
"list": [
12,
13,
14
],
"objectlist": [
{
"name": "name1",
"age": 12
},
{
"name": "name2",
"age": 13
}
],
"[\"key1\", \"key2\"]": [
"value1",
"value2"
]
}
三、基本常量的表示方法
在YAML語法中如何表示基本常量呢,下面舉例說明
# 整數
int:
- 123
- 0b1010_0111_0100_1010_1110 #二進制表示
canonical: 12345
decimal: +12,345
sexagecimal: 3:25:45
octal: 014
hexadecimal: 0xC
#浮點數
float:
- 3.14
- 6.8523015e+5 #可以使用科學計數法
canonical: 1.23015e+3
exponential: 12.3015e+02
sexagecimal: 20:30.15
fixed: 1,230.15
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
nullObj:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- Hello world
- 'Hello world' #可以使用雙引號或者單引號包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行會被轉化成一個空格
date:
- 2019-11-16 #日期必須使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2019-11-16T05:42:31+08:00 #時間使用ISO 8601格式,時間和日期之間使用T連接,最後使用+代表時區
JSON
{
"int": [
123,
685230
],
"canonical": 1230.15,
"decimal": 12345,
"sexagecimal": 73809.0,
"octal": 12,
"hexadecimal": 12,
"float": [
3.14,
685230.15
],
"exponential": 1230.15,
"fixed": 1230.15,
"boolean": [
true,
false
],
"nullObj": {
"nodeName": "node",
"parent": null
},
"string": [
"Hello world",
"Hello world",
"newline newline2"
],
"date": [
"2019-11-16"
],
"datetime": [
"2019-11-15 16:42:31 -0500"
]
}
四、特殊符號
1、— 和 …
在YAML裏 — 和 …表示文檔的開始和結束,相當於一個文件可以當作多個文件使用
server:
port: 8080
spring:
profiles:
active: dev
---
server:
port: 8081
spring:
profiles: dev
...
---
server:
port: 8082
spring:
profiles: prod
...
一般情況下…可以省略
server:
port: 8080
spring:
profiles:
active: dev
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod
記住要用…必須是 — 開頭, … 結尾,不能反了使用。
2、"" 和 ''的使用
這個在字符串中使用是有區別的;
雙引號會對字符傳中的特殊字符進行轉譯,但是單引號不會
YMAL
DoubleQuotes: "雙引號\n"
Apostrophe: '單引號\n'
JSON
{
"DoubleQuotes": "雙引號\n",
"Apostrophe": "單引號\\n"
}
3、!!
在YAML中 !! 表示強制轉換
YAML
number1: 1234
number2: !!str 1234
JSON
{
"number1": 1234,
"number2": "1234"
}
4、> 和 |
符號 > 表示字符串摺疊,下面同級的字符串其實表示一行,保留一個字符串
符號 | 表示字符串換行,每行字符串都保留了一個換行符
YAML
string1: >
第一行
第二行
string2: |
第一行
第二行
#這一行是爲了添加一個換行符
JSON
{
"string1": "第一行 第二行\n",
"string2": "第一行\n第二行\n"
}
5、&、* 和 << 符號的使用
& 表示錨點
* 表示引入
<< 表示合併
YAML
AnchorPoint: &AP {X: 1,Y: 2,Z: 3} #設置錨點,類似於 AP=AnchorPoint
example:
a: 1
Introduce: *AP #引入錨點,類似於 Introduce=AP
<<: *AP #合併錨點,類似於 example.push(AP)
JSON
{
"AnchorPoint": {
"X": 1,
"Y": 2,
"Z": 3
},
"example": {
"a": 1,
"Introduce": {
"X": 1,
"Y": 2,
"Z": 3
},
"X": 1,
"Y": 2,
"Z": 3
}
}
以上就介紹完了YAML的基本語法了,這些基本足夠開發過程中使用了,只有配置中的其他操作,可能需要依託平臺提供的工具才能使用,這裏就不介紹了。