YAML 語言教程

轉(zhuǎn)自: YAML 語言教程 阮一峰
鏈接地址:http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt

編程免不了要寫配置文件,怎么寫配置也是一門學(xué)問赚窃。
YAML 是專門用來寫配置文件的語言藕溅,非常簡潔和強(qiáng)大刻肄,遠(yuǎn)比 JSON 格式方便您朽。
本文介紹 YAML 的語法陈辱,以 JS-YAML 的實(shí)現(xiàn)為例卵皂。你可以去在線 Demo 驗(yàn)證下面的例子肾胯。

一掀淘、簡介

YAML 語言(發(fā)音 /?j?m?l/ )的設(shè)計(jì)目標(biāo)旬蟋,就是方便人類讀寫。它實(shí)質(zhì)上是一種通用的數(shù)據(jù)串行化格式革娄。
它的基本語法規(guī)則如下:

1倾贰、大小寫敏感
2、使用縮進(jìn)表示層級(jí)關(guān)系
3拦惋、縮進(jìn)時(shí)不允許使用Tab鍵匆浙,只允許使用空格。
4厕妖、縮進(jìn)的空格數(shù)目不重要首尼,只要相同層級(jí)的元素左側(cè)對(duì)齊即可

# 表示注釋,從這個(gè)字符一直到行尾言秸,都會(huì)被解析器忽略软能。
YAML 支持的數(shù)據(jù)結(jié)構(gòu)有三種。

對(duì)象:鍵值對(duì)的集合举畸,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
數(shù)組:一組按次序排列的值查排,又稱為序列(sequence) / 列表(list)
純量(scalars):單個(gè)的、不可再分的值

二俱恶、對(duì)象

對(duì)象的一組鍵值對(duì)雹嗦,使用冒號(hào)結(jié)構(gòu)表示范舀。

animal: pets

轉(zhuǎn)為 JavaScript 如下:

{ animal: 'pets' }

Yaml 也允許另一種寫法,將所有鍵值對(duì)寫成一個(gè)行內(nèi)對(duì)象了罪。

hash: { name: Steve, foo: bar } 

轉(zhuǎn)為 JavaScript 如下:

{ hash: { name: 'Steve', foo: 'bar' } }

三锭环、數(shù)組

一組連詞線開頭的行,構(gòu)成一個(gè)數(shù)組

- Cat
- Dog
- Goldfish

轉(zhuǎn)為 JavaScript 如下:

[ 'Cat', 'Dog', 'Goldfish' ]

數(shù)據(jù)結(jié)構(gòu)的子成員是一個(gè)數(shù)組泊藕,則可以在該項(xiàng)下面縮進(jìn)一個(gè)空格辅辩。

-
 - Cat
 - Dog
 - Goldfish

轉(zhuǎn)為 JavaScript 如下:

[ [ 'Cat', 'Dog', 'Goldfish' ] ]

數(shù)組也可以采用行內(nèi)表示法。

animal: [Cat, Dog]

轉(zhuǎn)為 JavaScript 如下:

{ animal: [ 'Cat', 'Dog' ] }

四娃圆、復(fù)合結(jié)構(gòu)

對(duì)象和數(shù)組可以結(jié)合使用玫锋,形成復(fù)合結(jié)構(gòu)。

languages:
 - Ruby
 - Perl
 - Python 
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org 

轉(zhuǎn)為 JavaScript 如下:

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

五讼呢、純量
純量是最基本的撩鹿、不可再分的值。以下數(shù)據(jù)類型都屬于 JavaScript 的純量悦屏。

字符串
布爾值
整數(shù)
浮點(diǎn)數(shù)
Null
時(shí)間
日期

數(shù)值直接以字面量的形式表示节沦。

number: 12.30

轉(zhuǎn)為 JavaScript 如下:

{ number: 12.30 }

布爾值用true和false表示。

isSet: true

轉(zhuǎn)為 JavaScript 如下:

{ isSet: true }

null用~表示

parent: ~ 

轉(zhuǎn)為 JavaScript 如下:

{ parent: null }

時(shí)間采用 ISO8601 格式

iso8601: 2001-12-14t21:59:43.10-05:00

轉(zhuǎn)為 JavaScript 如下:

{ iso8601: new Date('2001-12-14t21:59:43.10-05:00') }

日期采用復(fù)合 iso8601 格式的年、月、日表示篇梭。

date: 1976-07-31

轉(zhuǎn)為 JavaScript 如下:

{ date: new Date('1976-07-31') }

YAML 允許使用兩個(gè)感嘆號(hào),強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型叫搁。

e: !!str 123
f: !!str true

轉(zhuǎn)為 JavaScript 如下

{ e: '123', f: 'true' }

六、字符串

字符串是最常見供炎,也是最復(fù)雜的一種數(shù)據(jù)類型渴逻。
字符串默認(rèn)不使用引號(hào)表示。

str: 這是一行字符串

轉(zhuǎn)為 JavaScript 如下:

{ str: '這是一行字符串' }

如果字符串之中包含空格或特殊字符碱茁,需要放在引號(hào)之中裸卫。

str: '內(nèi)容: 字符串'

轉(zhuǎn)為 JavaScript 如下:

{ str: '內(nèi)容: 字符串' }

單引號(hào)和雙引號(hào)都可以使用,雙引號(hào)不會(huì)對(duì)特殊字符轉(zhuǎn)義纽竣。

s1: '內(nèi)容\n字符串'
s2: "內(nèi)容\n字符串"

轉(zhuǎn)為 JavaScript 如下:

{ s1: '內(nèi)容\\n字符串', s2: '內(nèi)容\n字符串' }

單引號(hào)之中如果還有單引號(hào)墓贿,必須連續(xù)使用兩個(gè)單引號(hào)轉(zhuǎn)義。

str: 'labor''s day' 

轉(zhuǎn)為 JavaScript 如下:

{ str: 'labor\'s day' }

字符串可以寫成多行蜓氨,從第二行開始聋袋,必須有一個(gè)單空格縮進(jìn)。換行符會(huì)被轉(zhuǎn)為空格穴吹。

str: 這是一段 
 多行 
 字符串

轉(zhuǎn)為 JavaScript 如下:

{ str: '這是一段 多行 字符串' }

多行字符串可以使用|保留換行符幽勒,也可以使用>折疊換行。

this: | 
  Foo 
  Bar
that: > 
  Foo 
  Bar

轉(zhuǎn)為 JavaScript 代碼如下:

{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }

+表示保留文字塊末尾的換行港令,-表示刪除字符串末尾的換行啥容。

s1: |
  Foo

s2: |+
  Foo


s3: |-
  Foo

轉(zhuǎn)為 JavaScript 代碼如下:

{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

字符串之中可以插入 HTML 標(biāo)記锈颗。

message: |

  <p style="color: red">
    段落
  </p>

轉(zhuǎn)為 JavaScript 如下:

{ message: '\n<p style="color: red">\n 段落\n</p>\n' }

七、引用

錨點(diǎn)&和別名*咪惠,可以用來引用击吱。

defaults: &defaults
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

等同于下面的代碼:

defaults:
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  adapter:  postgres
  host:     localhost

test:
  database: myapp_test
  adapter:  postgres
  host:     localhost

&用來建立錨點(diǎn)(defaults),<<表示合并到當(dāng)前數(shù)據(jù)遥昧,*用來引用錨點(diǎn)覆醇。
下面是另一個(gè)例子。

- &showell Steve 
- Clark 
- Brian 
- Oren 
- *showell

轉(zhuǎn)為 JavaScript 代碼如下:

[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]

八炭臭、函數(shù)和正則表達(dá)式的轉(zhuǎn)換

這是 JS-YAML 庫特有的功能永脓,可以把函數(shù)和正則表達(dá)式轉(zhuǎn)為字符串。

解析上面的 yml 文件的代碼如下鞋仍。

# example.yml
fn: function () { return 1 }
reg: /test/

從 JavaScript 對(duì)象還原到 yaml 文件的代碼如下:

var yaml = require('js-yaml');
var fs   = require('fs');

try {
  var doc = yaml.load(
    fs.readFileSync('./example.yml', 'utf8')
  );
  console.log(doc);
} catch (e) {
  console.log(e);
}

九常摧、參考鏈接

YAML 1.2 規(guī)格
YAML from Wikipedia
YAML for Ruby

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凿试,隨后出現(xiàn)的幾起案子排宰,更是在濱河造成了極大的恐慌,老刑警劉巖那婉,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異党瓮,居然都是意外死亡详炬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門寞奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呛谜,“玉大人,你說我怎么就攤上這事枪萄∫海” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瓷翻,是天一觀的道長聚凹。 經(jīng)常有香客問我,道長齐帚,這世上最難降的妖魔是什么妒牙? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮对妄,結(jié)果婚禮上湘今,老公的妹妹穿的比我還像新娘。我一直安慰自己剪菱,他們只是感情好摩瞎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布拴签。 她就那樣靜靜地躺著,像睡著了一般旗们。 火紅的嫁衣襯著肌膚如雪蚓哩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天蚪拦,我揣著相機(jī)與錄音杖剪,去河邊找鬼。 笑死驰贷,一個(gè)胖子當(dāng)著我的面吹牛盛嘿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播括袒,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼次兆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锹锰?” 一聲冷哼從身側(cè)響起芥炭,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恃慧,沒想到半個(gè)月后园蝠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痢士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年彪薛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怠蹂。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡善延,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出城侧,到底是詐尸還是另有隱情易遣,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布嫌佑,位于F島的核電站豆茫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歧强。R本人自食惡果不足惜澜薄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摊册。 院中可真熱鬧肤京,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妒峦,卻和暖如春重斑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肯骇。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工窥浪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笛丙。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓漾脂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胚鸯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骨稿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容