yaml語法及規范


在數據格式描述和較復雜數據內容展示方面的配置文件,JSON能夠很好的支持,包括語法突出顯示、自動格式化、驗證工具等。然而缺乏注釋,過於嚴格,長字符串轉換會出現問題等等。對於運維人員,面對較復雜的數據結構來說,不得不尋找一個替代的方式。
YAML(YAML 不是標記語言)是一種非常靈活的格式,幾乎是 JSON 的超集,已經被用在一些著名的項目中,如 Travis CI、Circle CI 和 AWS CloudFormation。YAML 的庫幾乎和 JSON 一樣無處不在。除了支持注釋、換行符分隔、多行字符串、裸字符串和更靈活的類型系統之外,YAML 也支持引用文件,以避免重復代碼。

  • YAML語法規范;
  • YAML文本塊得使用;
  • YAML錨點與引用;
  • YAML存量,數據類型約定;
  • YAML對象及數組的使用規則。

YAML簡介
YAML語言的設計參考了JSON,XML和SDL等語言。YAML 強調以數據為中心,簡潔易讀,編寫簡單。
YAML 語言(發音 /ˈjæməl/ )的設計目標,就是方便人類讀寫。它實質上是一種通用的數據串行化格式。
YAML 有一個小的怪癖。所有的 YAML 文件開始行都應該是 ---。這是 YAML 格式的一部分, 表明一個文件的開始。

有意思的命名
YAML全稱是”YAML Ain’t a Markup Language”(YAML不是一種置標語言)的遞歸縮寫。
在開發的這種語言時,YAML 的意思其實是:”Yet Another Markup Language”(仍是一種置標語言)。

YAML語法及規范

語法特點

  • 大小寫敏感
  • 通過縮進表示層級關系
  • 禁止使用tab縮進,只能使用空格鍵
  • 縮進的空格數目不重要,只要相同層級左對齊即可
  • 使用#表示注釋

YAML 支持的數據結構有三種
對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
純量(scalars):單個的、不可再分的值

引號

雙引號"":不會轉義字符串里面的特殊字符,特殊字符作為本身想表示的意思。
name: "123\n123" 
輸出: 123 換行 123

單引號'':會將字符串里面的特殊字符轉義為字符串處理
name: "123\n123"
輸出: 123\n123
如果不加引號將會轉義特殊字符,當成字符串處理

文本塊

|:使用|標注的文本內容縮進表示的塊,可以保留塊中已有的回車換行

value: |
   hello
   world!
輸出:hello 換行 world!

+表示保留文字塊末尾的換行,-表示刪除字符串末尾的換行。
value: |
hello

value: |-
hello

value: |+
hello

輸出:hello\n hello hello\n\n(有多少個回車就有多少個\n)

注意 “|” 與 文本之間須另起一行

>:使用 > 標注的文本內容縮進表示的塊,將塊中回車替換為空格,最終連接成一行

value: > hello
world!

輸出:hello 空格 world!

注意 “>” 與 文本之間的空格

使用定界符“”(雙引號)、‘’(單引號)或回車表示的塊,最終表示成一行。

錨點與引用

使用 & 定義數據錨點(即要復制的數據),使用 * 引用錨點數據(即數據的復制目的地)

name: &a yaml
book: *a
books: 
   - java
   - *a
   - python

輸出book: yaml
輸出books:[java,yaml,python]

注意*引用部分不能追加內容
  • 存量,數據類型約定 *
純量是最基本的、不可再分的值。
- 字符串
使用”或”“或不使用引號
value0: 'hello World!'
value1: "hello World!"
value2: hello World!

布爾值
true或false表示。

數字
12 #整數 
014 # 八進制整數 
0xC #十六進制整數 
13.4 #浮點數 
1.2e+34 #指數 
.inf空值 #無窮大

空值
null或~表示

日期
使用 iso-8601 標准表示日期

date: 2018-01-01t16:59:43.10-05:00
在springboot中yaml文件的時間格式 date: yyyy/MM/dd HH:mm:ss

強制類型轉換
YAML 允許使用個感嘆號!,強制轉換數據類型,單嘆號通常是自定義類型,雙嘆號是內置類型。
money: !!str
123
date: !Boolean
true

內置類型:
!!int # 整數類型 
!!float # 浮點類型 
!!bool # 布爾類型 
!!str # 字符串類型 
!!binary # 也是字符串類型 
!!timestamp # 日期時間類型 
!!null # 空值 
!!set # 集合 
!!omap,!!pairs # 鍵值列表或對象列表
!!seq # 序列,也是列表 !!map # 鍵值表

對象

Map(屬性和值)(鍵值對)的形式:
key:(空格)v :表示一堆鍵值對,空格不可省略。

car:
    color: red
    brand: BMW

一行寫法

car:{
   color: red,brand: BMW}

相當於json:
{"color":"red","brand":"BMW"}


使用冒號代表,格式為key: value。冒號后面要加一個空格:

---
#即表示url屬性值;
url: https://www.liuluanyi.cn 
轉為 JavaScript 如下:

{ url: 'https://www.liuluanyi.cn'}
Yaml 也允許另一種寫法,將所有鍵值對寫成一個行內對象。

--- 
host: { ip: 10.1.1.1, port: 2222 } 
轉為 JavaScript 如下:

{ host: { ip: '10.1.1.1', port: 2222 } }

數組

一組連詞線開頭的行,構成一個數組。
brand:
   - audi
   - bmw
   - ferrari
一行寫法
brand: [audi,bmw,ferrari]

相當於json
["auri","bmw","ferrari"]


列表中的所有成員都開始於相同的縮進級別, 並且使用一個 --- 作為開頭(一個橫杠和一個空格):

---
ipaddr:
# IP地址列表
- 120.168.117.21
- 120.168.117.22
- 120.168.117.23
轉為 JavaScript 如下:

 ipaddr: [ '120.168.117.21', '120.168.117.22', '120.168.117.23' ]
數據結構的子成員是一個數組,則可以在該項下面縮進一個空格。

-
 - source
 - destination
 - services
轉為 JavaScript 如下:

[ [ 'source', 'destination', 'services' ] ]
數組也可以采用行內(或者流式)表示法。

services: [FTP, SSH]
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
轉為 JavaScript 如下:

{ services: [ 'FTP', 'SSH' ] }
{ companies: 
   [ { id: 1, name: 'company1', price: '200W' },
     { id: 2, name: 'company2', price: '500W' } ] }

對象和數組復合使用

languages:
 - Ruby
 - Perl
 - Python 
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
轉為 JavaScript 如下:

{ languages: [ 'Ruby', 'Perl', 'Python' ],
  websites: { YAML: 'yaml.org', Ruby: 'ruby-lang.org', Python: 'python.org' } }

常量

  • 字符串
  • 布爾值
  • 整數
  • 浮點數
  • Null
  • 時間
  • 日期
    下面使用一個例子來快速了解常量的基本使用:
boolean: 
    - TRUE  #true,True都可以
    - FALSE  #false,False都可以
float:
    - 3.14
    - 6.8523015e+5  #可以使用科學計數法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    #二進制表示
null:
    nodeName: 'node'
    parent: ~  #使用~表示null
string:
    - 哈哈
    - 'Hello world'  #可以使用雙引號或者單引號包裹特殊字符
    - newline
      newline2    #字符串可以拆成多行,每一行會被轉化成一個空格
date:
    - 2018-02-17    #日期必須使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    #時間使用ISO 8601格式,時間和日期之間使用T連接,最后使用+代表時區
轉為 JavaScript 如下:

{ boolean: [ true, false ],
  float: [ 3.14, 685230.15 ],
  int: [ 123, 685230 ],
  null: { nodeName: 'node', parent: null },
  string: [ '哈哈', 'Hello world', 'newline newline2' ],
  date: [ Sat Feb 17 2018 08:00:00 GMT+0800 (中國標准時間) ],
  datetime: [ Sat Feb 17 2018 15:02:31 GMT+0800 (中國標准時間) ] }

特殊符號


1、YAML 允許使用兩個感嘆號,強制轉換數據類型。

e: !!str 123
f: !!str true
轉為 JavaScript 如下:

{ e: '123', f: 'true' }
2、 … 和---配合使用,在一個配置文件中代表一個文件的結束:

---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
3、>在字符串中折疊換行,| 保留換行符,這兩個符號是YAML中字符串經常使用的符號,比如:

this: |
  Foo
  Bar
that: >
  Foo
  Bar
轉為 JavaScript 如下:

{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }
4、引用。重復的內容在YAML中可以使用&來完成錨點定義,使用*來完成錨點引用,例如:

defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults
轉為 JavaScript 如下:

{ defaults: { adapter: 'postgres', host: 'localhost' },
  development: 
   { database: 'myapp_development',
     adapter: 'postgres',
     host: 'localhost' },
  test: 
   { database: 'myapp_test',
     adapter: 'postgres',
     host: 'localhost' } }
注意,不能獨立的定義錨點,比如不能直接這樣寫: &SS Sammy Sosa;另外,錨點能夠定義更復雜的內容,比如:
default: &default
    - Mark McGwire
    - Sammy Sosa
hr: *default
那么hr相當於引用了default的數組,注意,hr: *default要寫在同一行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM