1 YAML簡介
YAML,即YAML Ain’t Markup Language的縮寫,YAML 是一種簡潔的非標記語言。YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。
YAML的在線Demo這個YAML轉化JSON網頁中進行上手練習
2 YAML語法
- 大小寫敏感
- 使用縮進表示層級關系
- 禁止使用tab縮進,只能使用空格鍵
- 縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級。
- 使用#表示注釋
- 字符串可以不用引號標注
3 YAML 組織結構
YAML 文件可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作為分隔符。同時,文檔也可以使用“...”(三個點號)作為結束符(可選)。如果只是單個文檔,分隔符“---”可省略。
4 YAML數據結構
YAML 支持的數據結構有三種:
- 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
- 純量(scalars):單個的、不可再分的值
4.1 對象
4.1.1 使用 “:”(冒號) + 空格表示單個鍵值對
對象的一組鍵值對,使用 “:”(冒號) + 空格表示單個鍵值對,格式為key: value。冒號后面要加一個空格
key: value
可以使用縮進表示層級關系;
key:
child-key: value
child-key2: value2
key: {child-key: value, child-key2: value2}
4.1.2 使用"{}"表示一個鍵值表
items: {no: 1234, descript: cpu, price: ¥800.00}
4.1.3 "? " 問號+空格表示復雜的鍵
"? " 問號+空格表示復雜的鍵。當鍵是一個列表或鍵值表時,就需要使用本符號來標記。
- # 使用一個列表作為鍵
- ? [blue, reg, green]: Color
- # 等價於
- ? - blue
- - reg
- - gree
- : Color
4.2 數組
使用一個短橫線加一個空格代表一個數組項:
hobby:
- Java
- LOL
當然也可以有這樣的寫法:
-
- Java
- LOL
可以簡單理解為:[[Java,LOL]]
數組的理解:
PaymentDetail:
- billPaymentNo: "201904171022507929513877465876"
- paymentAmount: 1000.00
- paymentMethod1: "ODD"
- paymentSuccessDate: 2019-04-17 13:00:00
轉為json如下:
PaymentDetail:[{billPaymentNo: '201904171022507929513877465876' },{paymentAmount: 1000 },{paymentMethod1: 'ODD' },{paymentSuccessDate: Wed Apr 17 2019 21:00:00 GMT+0800 (China Standard Time)}]
理解為:PaymentDetail值為一個列表,列表中有四個元素,其中每個元素都是一個字典,每個字典中只有一個鍵值對
PaymentDetail1:
- billPaymentNo: "201904171022507929513877465876"
paymentAmount: 1000.00
paymentMethod1: "ODD"
paymentSuccessDate: 2019-04-17 13:00:00
轉為json如下:
PaymentDetail1: [{billPaymentNo:'201904171022507929513877465876',paymentAmount: 1000, paymentMethod1: 'ODD',paymentSuccessDate: Wed Apr 17 2019 21:00:00 GMT+0800 (China Standard Time)}]
理解為:PaymentDetail1值為一個列表,列表中只有一個元素,該元素為一個字典,字典由多個鍵值對構成
4.3 復合結構
對象和數組可以結合使用,形成復合結構。
2. languages:
- - Ruby
- - Perl
- - Python
6. 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' } }
4.4 純量
純量是最基本的、不可再分的值。以下數據類型都屬於純量:
l 字符串
l 布爾值
l 整數
l 浮點數
l Null
l 時間
l 日期
4.5 特殊用法
4.5.1 !! YAML中使用!!做類型強行轉換:
yamlbeans包一般用!(單嘆號)做類型轉換,snakeyaml包一般用!!(雙嘆號)做類型轉換
string:
- !!str 54321
- !!str true
相當於把數字和布爾類型強轉為字符串。當然允許轉型的類型很多,比如:
--- !!set
- Mark McGwire: 65
- Sammy Sosa: 63
- Sammy Sosa: 63
- Ken Griffy: 58
將數組解析為set,轉化的內容就是:[{Ken Griffy=58}, {Mark McGwire=65}, {Sammy Sosa=63}],重復的Sammy Sosa去掉;
4.5.2 字符串默認不使用引號表示。
str: 這是一行字符串
4.5.3 字符串之中包含空格或特殊字符,需要放在引號之中
如果字符串之中包含空格或特殊字符,需要放在引號之中。單引號和雙引號都可以使用
str: '內容: 字符串'
4.5.4 雙引號不會對特殊字符轉義。
s1: '內容\n字符串'
s2: "內容\n字符串"
4.5.5 單引號之中如果還有單引號,必須連續使用兩個單引號轉義。
str: 'labor''s day'
4.5.6 多行字符串可以使用|
保留換行符,也可以使用>
折疊換行。
this: |
Foo
Bar
that: >
Foo
Bar
轉為 JavaScript 代碼如下:
{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
4.5.7 +
表示保留文字塊末尾的換行,-
表示刪除字符串末尾的換行。
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
轉為 JavaScript 代碼如下。
{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
4.5.8 布爾值用true
和false
表示。
NULL
用~
表示。
4.5.9 錨點&和別名*,可以用來引用,定義數據的復用
第一步:使用 “&” 定義數據錨點(即要復制的數據)
第二步:使用 “*” 引用上述錨點數據(即數據的復制目的地)
2. defaults: &defaults
- adapter: postgres
- host: localhost
6. development:
- database: myapp_development
- <<: *defaults
- test:
- database: myapp_test
- <<: *defaults
等同於下面的代碼。
2. defaults:
- adapter: postgres
- host: localhost
6. development:
- database: myapp_development
- adapter: postgres
- host: localhost
- test:
- database: myapp_test
- adapter: postgres
- host: localhost
&用來建立錨點(defaults),<<表示合並到當前數據,*用來引用錨點。
下面是另一個例子。
2. - &showell Steve
3. - Clark
4. - Brian
5. - Oren
6. - *showell
轉為 JavaScript 代碼如下。
- [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]