YAML入門

YAML

YAML Ain’t Markup Language

和GNU一樣,YAML是一個遞歸着說“不”的名字。不同的是,GNU對UNIX說不,YAML說不的對象是XML。因爲:

  • YAML的可讀性好
  • YAML和腳本語言的交互性好
  • YAML使用實現語言的數據類型
  • YAML有一個一致信息模型
  • YAML易於實現

同時YAML也有XML的以下優點:

  • YAML可以基於流來處理
  • YAML表達能力強,擴展性好

相對於JSON:

​ YAML是JSON的一個嚴格的超集。

語法

  • Structure通過空格來展示。Sequence裏的項用"-“來代表,Map裏的鍵值對用”:"分隔.
  • 大小寫敏感
  • 使用縮進表示層關係,並且縮進不允許使用Tab鍵。而且縮進的空格數目都不重要,只要相同層級的元素左對齊即可。

快速入門

YAML中允許表示三種格式,分別是常量值,對象和數組

基本格式要求

  • YAML大小寫敏感
  • 使用縮進代表層級關係
  • 縮進只能使用空格,不能使用TABLE,不要求空格個數,只需要相同層級左對齊(一般2個或4個空格)

對象

使用冒號代表,格式爲key: value。冒號後邊要加一個空格。

key: value

可以使用縮進表示層級關係

key:
	child-key1: value1
	child-key2: value2

YAML中還支持流式(flow)語法表示對象

key: {child-key1: value1, child-key2: value2}

較爲複雜的對象格式, 可以使用問號加一個空格代表一個複雜的Key,再配合一個冒號加一個空格代表一個value

?
	- complexkey1
	- complexkey2
:
	- complexvalue1
	- complexvalue2

意思是對象的屬性是一個數組[complexkey1, complexkey2], 對應的值也是一個數組[complexvalue1, complexvalue2]。

數組

使用一個短橫線加一個空格代表一個數組項

hobby:
	- Java
	- Python

一個相對複雜的例子

textEditor:
	-
		id: 1
		name: Emacs
	-
		id: 2
		name: vim

使用流式表示就是

textEditor: [{id: 1, name: Emacs}, {id: 2, name: vim}]

常量

YAML中提供了多種常量結構,包括:整數,浮點數,字符串,NULL,日期,布爾,時間。

boolean: 
	- TRUE
	- FALSE
float:
	- 3.14
	- 5.234234e+5   #可以使用科學計數法
int:
	- 123
	- 0b1010_0111_0100_1010_1110    # 可以使用二進制表示
null:
	nodeName: 'node'
	parent: ~	# 使用~表示null
string:
	- 哈哈
	- 'Hello world'		# 可以使用雙引號或者單引號包裹特殊字符
	- newline
	  newline2		# 字符串可以拆成多行,每一換行會被轉化成一個空格
date:
	- 2018-01-01	# 日期必須使用ISO 8601格式,即yyyy-MM-dd
datetime:
	- 2018-01-01T15:01:01+08:00		# 時間使用ISO 8601格式,時間和日期之間使用T連接,最後使用+代表時區

一些特殊符號

YAML中提供了很多特殊符號

YAML可以在同一個文件中表示多個文檔,使用三減號(—)表示一個文檔的開始。

e.g.

server:
	address: 192.168.1.125
---
spring:
	profiles: development
	server:
		address: 127.0.0.1
---
spring:
	profiles: production
	server:
		address: 192.168.100.1

此文件代表定義了兩個profile, 一個是development, 一個是production。

…和—

…和—配合使用,在一個配置文件中代表一個文件的結束

---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
!!

!!在YAML用作強制類型轉換

string:
	- !!str 12345
	- !!str true

--- !!set
- Mark McGwire: 65
- Sammy Sosa: 63
- Sammy Sosa: 63
- Ken Griffy: 58
> 和 |

在字符串中摺疊換行,| 保留換行符,這兩個符號是YAML中字符串經常使用的符號,比如

accomplishment: >
 Mark set a major league
 home run record in 1998.
stats: |
 65 Home Runs
 0.278 Batting Average

的輸出結果是

accomplishment=Mark set a major league home run record in 1998.
stats=65 Home Runs
 0.278 Batting Average,
引用

重複的內容在YAML中可以使用&來完成錨點定義,使用*來完成錨點引用。

hr:
- Mark McGwire
- &SS Sammy Sosa
rbi:
- *SS 
- Ken Griffey

或者

SS: &SS Sammy Sosa
hr:
 - Mark McGwire
 - *SS
rbi:
 - *SS 
 - Ken Griffey

或者

default: &default
    - Mark McGwire
    - Sammy Sosa
hr: *default	# 引用一個數組
合併內容
merge:
  - &CENTER { x: 1, y: 2 }
  - &LEFT { x: 0, y: 2 }
  - &BIG { r: 10 }
  - &SMALL { r: 1 }
  
sample1: 
    <<: *CENTER
    r: 10
    
sample2:
    << : [ *CENTER, *BIG ]
    other: haha
    
sample3:
    << : [ *CENTER, *BIG ]
    r: 100

YAML的適用範圍

適用於腳本語言:由於實現簡單,解析成本很低,YAML特別適合在腳本語言中使用。如:Ruby,Java,Perl,Python, PHP, OCaml, JavaScript。

序列化: YAML比較適合做序列化。因爲它是宿主語言數據類型直轉的。

配置文件:YAML做配置文件也不錯。比如Ruby on Rails的配置文件。SpringBoot的配置文件。

YAML的不足

YAML沒有自己的數據類型定義。

所以,由於兼容性問題,不同語言間的數據流轉建議現在不要使用YAML。

註釋

YAML中只有行註釋,使用#號作爲註釋標誌。

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章