Yet Another Markup Language
另一種標(biāo)記語言
特別適合用 grep、Python、Perl、Ruby 操作
多行縮進(jìn)
連續(xù)的項目通過減號 ‘ - ’ 來表示
Map結(jié)構(gòu)里面的 key/value 對用冒號 ‘ : ’ 來分隔
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: 610101
Tip
- 字串不一定要用雙引號標(biāo)識
- 在縮排中空白字符的數(shù)目并不是非常重要,只要相同階層的元素左側(cè)對齊就可以了(不過不能使用
TAB
字符) - 允許在文件中加入選擇性的空行,以增加可讀性
- 在一個檔案中,可同時包含多個文件,并用
---
分隔 - 選擇性的符號
...
可以用來表示檔案結(jié)尾(在利用串流的通訊中,這非常有用,可以在不關(guān)閉串流的情況下,發(fā)送結(jié)束訊號)
單行縮寫
- 數(shù)組用
[]
- Hash用
{}
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 235011 }
適用場景
- 實(shí)現(xiàn)簡單,解析成本很低,YAML 特別適合在腳本語言中使用
- YAML 比較適合做序列化,因為它是宿主語言數(shù)據(jù)類型直轉(zhuǎn)的
- YAML 做配置文件也不錯
附加 YAML 庫到瀏覽器
<script src="/scripts/js-yaml.min.js" />
<script type="text/javascript">
var doc = jsyaml.load('greeting: hello\nname: world')
</script>
與 JSON
JSON 的語法是 YAML1.2 版的子集, JSON 文件都可以被 YAML 的剖析器剖析
YAML 的許多擴(kuò)展在 JSON 是找不到的。
如:進(jìn)階資料形態(tài)、關(guān)系錨點(diǎn)、字串不需要雙引號、映射資料形態(tài)會儲存鍵值的順序
與 XML和SDL
XML 和 SDL 標(biāo)簽概念,在 YAML 中是找不到的
安全性
YAML 是純粹用來表達(dá)資料的語言,所以內(nèi)部不會存代碼注入的可執(zhí)行命令
語法
- YAML 使用可打印的 Unicode 字符,可使用 UTF-8 或 UTF-16
- 使用空白字符(不能使用
Tab
)分層,同層元素左側(cè)對齊 - 單行注解由井字號(
#
)開始,可以出現(xiàn)在行中任何位置 - 每個清單成員以單行表示,并用短杠+空白(
-
)起始 - 每個雜湊表的成員用冒號+空白(
:
)分開鍵和值 - 每個雜湊表的成員用冒號+空白(
:
)分開鍵和值 - 字串一般不使用引號,但必要的時候可以用引號框住
- 使用雙引號表示字串時,可用倒斜線(
\
)進(jìn)行特殊字符轉(zhuǎn)義 - 區(qū)塊的字串用縮排和修飾詞(非必要)來和其他資料分隔,有新行保留(使用符號
|
)或新行折疊(使用符號>
)兩種方式 - 在單一檔案中,可用連續(xù)三個連字號(
---
)區(qū)分多個檔案 - 可選擇性的連續(xù)三個點(diǎn)號(
...
)用來表示檔案結(jié)尾(在流式傳輸時非常有用,不需要關(guān)閉流即可知道到達(dá)結(jié)尾處) - 重復(fù)的內(nèi)容可使從參考標(biāo)記星號 (
*
)復(fù)制到錨點(diǎn)標(biāo)記(&
) - 指定格式可以使用兩個驚嘆號 (
!!
),后面接上名稱
YAML語法示例
receipt: Oz-Ware Purchase Invoice
date: 2015-12-15
customer:
given: Dorothy
family: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
price: 100.27
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Westville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
轉(zhuǎn)換成 JSON 之后
{
"receipt": "Oz-Ware Purchase Invoice",
"date": "2015-12-15T00:00:00.000Z",
"customer": {
"given": "Dorothy",
"family": "Gale"
},
"items": [
{
"part_no": "A4786",
"descrip": "Water Bucket (Filled)",
"price": 1.47,
"quantity": 4
},
{
"part_no": "E1628",
"descrip": "High Heeled \"Ruby\" Slippers",
"price": 100.27,
"quantity": 1
}
],
"bill-to": {
"street": "123 Tornado Alley\nSuite 16\n",
"city": "East Westville",
"state": "KS"
},
"ship-to": {
"street": "123 Tornado Alley\nSuite 16\n",
"city": "East Westville",
"state": "KS"
},
"specialDelivery": "Follow the Yellow Brick Road to the Emerald City. Pay no attention to the man behind the curtain.\n"
}
- 其中一個鍵值
items
,是倆個元素構(gòu)成的清單,當(dāng)中的倆個元素分別是包含四個 HASH 鍵值對的 - 使用錨點(diǎn) (
&
) 和參考 (*
) 標(biāo)簽將bill-to
復(fù)制到了ship-to
XML和 YAML 語法格式
XML
<site>
<name>yugo</name>
<url>github.io/miyogurt</url>
</site>
YAML - Type 01
# example
---
site:
name: yugo
url: github.io/miyogurt
YAML - Type 02
# example
---
site: { name:yugo,url: github.io/miyogurt }