yaml 解决问题
yaml 是什么?
在 github 一些開(kāi)源項(xiàng)目里經(jīng)常可以看到 .travis.yml 文件,后來(lái)接觸持續(xù)集成這個(gè)概念時(shí)發(fā)現(xiàn)很多文件都是 .yml 后綴的文件。我在 阮一峰-YAML 語(yǔ)言教程 里了解了它的作用以及基本寫(xiě)法,他的那篇文章描述的略微有點(diǎn)啰嗦,實(shí)際看到的大多數(shù)配置文件還是及其簡(jiǎn)單的,而我們要做的是能讀懂它們,就像讀懂 .json 一樣。
yaml 語(yǔ)言(或者說(shuō)是一種規(guī)范吧)可以編寫(xiě) .yml 文件,和 json 一樣是配置文件。也許是有人認(rèn)為 json 的寫(xiě)法不爽,于是乎發(fā)明了這玩意,通過(guò)下面的例子,可以看到 yaml 寫(xiě)的配置文件確實(shí)要比 json 方便很多。
編寫(xiě)規(guī)則
- 大小寫(xiě)敏感
json 里也是大小寫(xiě)敏感的,這點(diǎn)二者一樣。
- 使用縮進(jìn)表示層級(jí)關(guān)系
json 中使用 {} 的嵌套表示層級(jí),而 yaml 使用縮進(jìn),后者更方便一些。
- # 表示注釋
json 文件中不允許寫(xiě)注釋,對(duì)于很長(zhǎng)配置文件全靠字面意思猜挺痛快的,yaml 可以寫(xiě)注釋,:100:
數(shù)據(jù)結(jié)構(gòu)
配置文件理應(yīng)十分簡(jiǎn)潔,與 json 相比,不用頻繁的寫(xiě) {} 和 [],畢竟換行和 - 符號(hào)更加簡(jiǎn)潔,字符串也不需要頻繁的加引號(hào)(無(wú)論是單引號(hào)還是雙引號(hào))。
對(duì)象
# conf.yml animal: pets hash: { name: Steve, foo: bar }轉(zhuǎn)換為 json 為:
{{ "animal": "pets" },{ "hash": { "name": "Steve", "foo": "bar" } } }數(shù)組
# conf.yml Animal:- Cat- Dog- Goldfish轉(zhuǎn)換為 json 為:
{ "Animal": [ "Cat", "Dog", "Goldfish" ] }字符串
# conf.yml # 正常情況下字符串不用寫(xiě)引號(hào) str: 這是一行字符串 # 字符串內(nèi)有空格或者特殊字符時(shí)需要加引號(hào) str: '內(nèi)容: 字符串'null
# conf.yml parent: ~.yml 中 ~ 表示 null,轉(zhuǎn)換為 json 為:
{ "parent": null }1. 認(rèn)識(shí) YAML
YAML是一個(gè)類(lèi)似 XML、JSON 的標(biāo)記性語(yǔ)言。YAML 強(qiáng)調(diào)以數(shù)據(jù)為中心,并不是以標(biāo)識(shí)語(yǔ)言為重點(diǎn)。因而 YAML 本身的定義比較簡(jiǎn)單,號(hào)稱(chēng)“一種人性化的數(shù)據(jù)格式語(yǔ)言”。
1.1 YAML 的設(shè)計(jì)目標(biāo):
人類(lèi)容易閱讀
可用于不同程序間的數(shù)據(jù)交換
適合描述程序所使用的數(shù)據(jù)結(jié)構(gòu),特別是腳本語(yǔ)言
豐富的表達(dá)能力與可擴(kuò)展性
易于使用
1.2 YAML 與 XML、JSON
YAML 與 XML
具有 XML 同樣的優(yōu)點(diǎn),但比 XML 更加簡(jiǎn)單、敏捷等
YAML 與 JSON
JSON 可以看作是 YAML 的子集,也就是說(shuō) JSON 能夠做的事情,YAML 也能夠做
YAML 能表示得比 JSON 更加簡(jiǎn)單和閱讀,例如“字符串不需要引號(hào)”。所以 YAML 容易可以寫(xiě)成 JSON 的格式,但并不建議這種做
YAML 能夠描述比 JSON 更加復(fù)雜的結(jié)構(gòu),例如“關(guān)系錨點(diǎn)”可以表示數(shù)據(jù)引用(如重復(fù)數(shù)據(jù)的引用)。
1.3 YAML 組織結(jié)構(gòu)
YAML 文件可以由一或多個(gè)文檔組成(也即相對(duì)獨(dú)立的組織結(jié)構(gòu)組成),文檔間使用“---”(三個(gè)橫線)在每文檔開(kāi)始作為分隔符。同時(shí),文檔也可以使用“...”(三個(gè)點(diǎn)號(hào))作為結(jié)束符(可選)。如下圖所示:
如果只是單個(gè)文檔,分隔符“---”可省略。
每個(gè)文檔并不需要使用結(jié)束符“...”來(lái)表示結(jié)束,但是對(duì)于網(wǎng)絡(luò)傳輸或者流來(lái)說(shuō),作為明確結(jié)束的符號(hào),有利于軟件處理。(例如不需要知道流關(guān)閉就能知道文檔結(jié)束) <br/>
YAML 認(rèn)為數(shù)據(jù)由以下三種結(jié)構(gòu)組成:(每個(gè)文檔由三種結(jié)構(gòu)混合組成)
標(biāo)量 (相當(dāng)于數(shù)據(jù)類(lèi)型)
序列 (相當(dāng)于數(shù)組和列表)
鍵值表(相當(dāng)于 Map 表)
2. YAML 編寫(xiě)規(guī)范
規(guī)范一:文檔使用 Unicode 編碼作為字符標(biāo)準(zhǔn)編碼,例如 UTF-8
規(guī)范二:使用“#”來(lái)表示注釋內(nèi)容
# 客戶訂單
date: 2015-02-01
customer:
? - name: Jai
items:
? - no: 1234 ? ? ? ? # 訂單號(hào)
? - descript: cpu
規(guī)范三:使用空格作為嵌套縮進(jìn)工具。通常建議使用兩個(gè)空格縮進(jìn),不建議使用 tab (甚至不支持)
規(guī)范四:序列表示
使用“-”(橫線) + 單個(gè)空格表示單個(gè)列表項(xiàng)
--- # 文檔開(kāi)始
- 第一章 簡(jiǎn)介
- 第二章 設(shè)計(jì)目錄
使用"[]"表示一組數(shù)據(jù)
--- # 文檔開(kāi)始
[blue, red, green]
組合表示。每個(gè)結(jié)構(gòu)都可以嵌套組成復(fù)雜的表示結(jié)構(gòu)。
--- # 文檔開(kāi)始
- [blue, red, green] ? ? # 列表項(xiàng)本身也是一個(gè)列表
- [Age, Bag]
- site: {osc:www.oschina.net, baidu: www.baidu.com} ?# 這里是同 鍵值表 組合表示
規(guī)范五:鍵值表
使用 “:”(冒號(hào)) + 空格表示單個(gè)鍵值對(duì)
# 客戶訂單
date: 2015-02-01
customer:
? - name: Jai
items:
? - no: 1234 ? ? ? ? # 訂單號(hào)
? - descript: cpu
? - price: ¥800.00
使用"{}"表示一個(gè)鍵值表
# 客戶訂單
date: 2015-02-01
customer:
? - name: Jai
items: {no: 1234, descript: cpu, price: ¥800.00}
"? " 問(wèn)號(hào)+空格表示復(fù)雜的鍵。當(dāng)鍵是一個(gè)列表或鍵值表時(shí),就需要使用本符號(hào)來(lái)標(biāo)記。
?# 使用一個(gè)列表作為鍵
?? [blue, reg, green]: Color
?# 等價(jià)于
?? - blue
? ?- reg
? ?- gree
?: Color
組合表示。每個(gè)結(jié)構(gòu)都可以嵌套組成復(fù)雜的表示結(jié)構(gòu)。?
?Color:
? ? - blue
? ? - red
? ? - green
?
?# 相當(dāng)于 (也是 JSON 的表示)
?{Color: [blue, red, green]}
?div:
? ? - border: {color: red, width: 2px}
? ? - background: {color: green}
? ? - padding: [0, 10px, 0, 10px]
?# 使用縮進(jìn)表示的鍵值表與列表項(xiàng)
?items:
? ? - item: cpu
? ? ? model: i3
? ? ? price: ¥800.00
? ? - item: HD
? ? ? model: WD
? ? ? price: ¥450.00
?# 上面使用 “-” 前導(dǎo)與縮進(jìn)來(lái)表示多個(gè)列表項(xiàng),相當(dāng)于下面的JSON表示
?items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]
規(guī)范六:文本塊
使用 “|” 和文本內(nèi)容縮進(jìn)表示的塊:保留塊中已有的回車(chē)換行。相當(dāng)于段落塊
yaml: | ? ? ?# 注意 ":" 與 "|" 之間的空格
? ?JSON的語(yǔ)法其實(shí)是YAML的子集,大部分的JSON文件都可以被YAML的解釋器解釋。
? ?如果你想更深入的學(xué)習(xí)YAML,我建議你去 http://www.yaml.org 看看
使用 “>” 和文本內(nèi)容縮進(jìn)表示的塊:將塊中回車(chē)替換為空格,最終連接成一行。
yaml: > ? ? ?# 注意 ":" 與 ">" 之間的空格,另外可以使用空行來(lái)分段落
? ?JSON的語(yǔ)法其實(shí)是YAML的子集,
? ?大部分的JSON文件都可以被YAML的解釋器解釋。
? ?如果你想更深入的學(xué)習(xí)YAML,我建議你去 http://www.yaml.org 看看
使用定界符“”(雙引號(hào))、‘’(單引號(hào))或回車(chē)表示的塊:最終表示成一行。
yaml: ? ? # 使用回車(chē)的多行,最終連接成一行。
? ?JSON的語(yǔ)法其實(shí)是YAML的子集,
? ?大部分的JSON文件都可以被YAML的解釋器解釋。
yaml: ? ? # 使用了雙引號(hào),雙引號(hào)的好處是可以轉(zhuǎn)義,即在里面可以使用特殊符號(hào)
? ?"JSON的語(yǔ)法其實(shí)是YAML的子集,
? ?大部分的JSON文件都可以被YAML的解釋器解釋。"
規(guī)范七:數(shù)據(jù)類(lèi)型的約定
對(duì)一些常用數(shù)據(jù)類(lèi)型的表示格式進(jìn)行了約定,包括:
?integer: 12345 ? ? # 整數(shù)標(biāo)準(zhǔn)形式
?octal: 0o34 ? ? ? ?# 八進(jìn)制表示,第二個(gè)是字母 o
?hex: 0xFF ? ? ? ? ?# 十六進(jìn)制表示
?
?float: 1.23e+3 ? ? # 浮點(diǎn)數(shù)
?fixed: 13.67 ? ? ? # 固定小數(shù)
?minmin: -.inf ? ? ?# 表示負(fù)無(wú)窮
?notNumber: .NaN ? ?# 無(wú)效數(shù)字
?
?null: ? ? ? ? ? ? ?# 空值
?boolean: [true, false] # 布爾值
?string: ‘12345‘ ? ?# 字符串
?
?date: 2015-08-23 ? # 日期
?datetime: 2015-08-23T02:02:00.1z ?# 日期時(shí)間
?iso8601: 2015-08-23t21:59:43.10-05:00 ?# iso8601 日期格式
?spaced: 2015-08-23 21:59:43.10 -5 ? ? ?# ?
“!”(嘆號(hào))顯式指示類(lèi)型,或自定義類(lèi)型標(biāo)識(shí)。單嘆號(hào)通常是自定義類(lèi)型,雙嘆號(hào)是內(nèi)置類(lèi)型
?isString: !!str 2015-08-23 ? ? # 強(qiáng)調(diào)是字符串不是日期數(shù)據(jù)
?picture: !!binary | ? ? ? ? ? ?# Base64 ?圖片
? ? ?R0lGODlhDAAMAIQAAP//9/X
? ? ?17unp5WZmZgAAAOfn515eXv
? ? ?Pz7Y6OjuDg4J+fn5OTk6enp
? ? ?56enmleECcgggoBADs=
?#下面是內(nèi)置類(lèi)型
?!!int ? ? ? ? ? ? ? # 整數(shù)類(lèi)型
?!!float ? ? ? ? ? ? # 浮點(diǎn)類(lèi)型
?!!bool ? ? ? ? ? ? ?# 布爾類(lèi)型
?!!str ? ? ? ? ? ? ? # 字符串類(lèi)型
?!!binary ? ? ? ? ? ?# 也是字符串類(lèi)型
?!!timestamp ? ? ? ? # 日期時(shí)間類(lèi)型
?!!null ? ? ? ? ? ? ?# 空值
?!!set ? ? ? ? ? ? ? # 集合
?!!omap, !!pairs ? ? # 鍵值列表或?qū)ο罅斜?/p>
?!!seq ? ? ? ? ? ? ? # 序列,也是列表
?!!map ? ? ? ? ? ? ? # 鍵值表
?#下面是一些例子:
?--- !!omap
?- Mark: 65
?- Sammy: 63
?- Key: 58
?--- !!set ? ? ? ? ? # 注意,“?”表示鍵為列表,在這里列表為 null
?? Mark
?? Sammy
?? Key
?# 下面是自定義的類(lèi)型或標(biāo)識(shí)
?%TAG ! tag:clarkevans.com,2002: ? # % 是指令符號(hào)
?--- !shape
?# Use the ! handle for presenting
?# tag:clarkevans.com,2002:circle
?- !circle
? ?center: &ORIGIN {x: 73, y: 129}
? ?radius: 7
?- !line
? ?start: *ORIGIN
? ?finish: { x: 89, y: 102 }
?- !label
? ?start: *ORIGIN
? ?color: 0xFFEEBB
? ?text: Pretty vector drawing.
規(guī)范八:錨點(diǎn)與引用,定義數(shù)據(jù)的復(fù)用。
第一步:使用 “&” 定義數(shù)據(jù)錨點(diǎn)(即要復(fù)制的數(shù)據(jù))
第二步:使用 “*” 引用上述錨點(diǎn)數(shù)據(jù)(即數(shù)據(jù)的復(fù)制目的地)
?---
?hr:
? ?- Mark McGwire
? ?# Following node labeled SS
? ?- &SS Sammy Sosa ? ? ? ? ? ?# 定義要復(fù)制的數(shù)據(jù)
?rbi:
? ?- *SS # Subsequent occurrence ? 這里是數(shù)據(jù)復(fù)制目標(biāo)
?
總結(jié)
- 上一篇: models.ForeignKey( ,
- 下一篇: VUE 身份证号验证