YAML學習

龍恩0707發表於2018-06-09

YAML學習

一:什麼是YAML?
YAML是專門用來寫配置檔案的語言,通過它來編寫完成後,我們可以通過外掛JS-YAML(https://github.com/nodeca/js-yaml) 來轉換成我們的json資料。

二:有如下基本語法規則:

1 大小寫敏感
2 使用縮排表示層級關係
3 縮排時相同層級的元素左側對齊即可
4 使用 "#" 來表示註釋。

支援的資料格式如下:

1. 物件:鍵值對的集合。
2. 陣列:
3. 純量;單個的,不可再分的值

2.1 物件
物件是由一組鍵值對組成,是使用冒號結構來表示;如下:

name: kongzhi

它會被轉為如下的json資料:

{ name: 'kongzhi' }

假如我現在的專案目錄如下結構:

### 目錄結構如下:
demo                                        # 工程名
|   |--- index.js                                   
|   |--- index.yaml
|   |--- package.json

index.yaml 程式碼如下:
name: kongzhi

index.js 程式碼如下:

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

const doc = yaml.safeLoad(fs.readFileSync('./index.yaml', 'utf-8'));

console.log(doc);

執行命令 node index.js 就可以列印出
{ name: 'kongzhi' }

YAML也允許如下寫法,將所有鍵值對寫成一個行內物件;如下:

obj: { name: kongzhi, age: 30 }

轉為js就變成如下:
{ obj: { name: 'kongzhi', age: 30 } }

2.2 陣列:
一組以橫線開頭的行,構成一個陣列。 如下程式碼:

- kongzhi
- longen
- tugenhua

轉為js變為如下:
[ 'kongzhi', 'longen', 'tugenhua' ]

巢狀陣列:

對陣列可以巢狀陣列,比如 [['kongzhi', 'longen', 'tugenhua']] 這樣的。可以如下程式碼:

-
  - kongzhi
  - longen
  - tugenhua

物件巢狀陣列:

比如如下程式碼:

obj:
  - kongzhi
  - longen
  - tugenhua

就會轉為為成:

{ obj: [ 'kongzhi', 'longen', 'tugenhua' ] }

這樣的。

陣列也可以巢狀物件, 比如如下這樣的:

-
  { name: kongzhi, age: 30 }

-
  name: kongzhi
  age: 30

轉為js,變為如下:
[ { name: 'kongzhi', age: 30 } ]

如果多個陣列的話,如下這種寫法是可以的;
[
  { name: kongzhi, age: 30 },
  { name: kongzhi, age: 30 }
]

或者如下這樣的:

- name: kongzhi
- name: longen0707
- name: tugenhua

就會轉化成如下這樣的:

[ 
  { name: 'kongzhi' },
  { name: 'longen0707' },
  { name: 'tugenhua' } 
] 

2.3 純量
純量是最基本的,不可再分的值,以下資料型別都屬於javascript的純量。

字串,布林型,整數,浮點數,Null, 時間, 日期等

1. 字串

字串預設不使用引號表示。如下:
str: 空智

轉為js變為如下:
{ str: '空智' }

但是如果字串中包含空格或特殊字元需要使用引號;如下所示:
str: '空智: 123'

轉為js變為如下:
{ str: '空智: 123' }

如果不使用引號就會報錯的

單引號中如果還有單引號,需要使用單引號進行轉義,比如:
name: I am Tom's

需要寫成如下:
name: 'I am Tom''s'

最後會轉成 如下這樣的:
{ name: 'I am Tom\'s' }

字串也可以寫成多行,從第二行開始,必須有一個單空格縮排,換行符會轉換為空格。如下:

name: 這是一段
  多行
  字串

轉換成js變為如下:

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

保留換行符 和 摺疊換行

多行字串可以使用 | 保留換行符,使用 > 摺疊換行;如下程式碼:

name: |
  kongzhi
  longen0707
age: >
  kongzhi
  longen0707

轉為js變為如下:

{ name: 'kongzhi\nlongen0707\n', age: 'kongzhi longen0707\n' }

+ 表示保留文字塊末尾的換行,- 表示刪除字串末尾的換行

如下程式碼:

name1: |
  kongzhi

name2: |+
  longen0707



name3: |-
  tugenhua

轉為js變為如下:

{ 
  name1: 'kongzhi\n',
  name2: 'longen0707\n\n\n\n',
  name3: 'tugenhua' 
}

字串中插入HTML標記

如下程式碼:

name: |
  <div style="color:blue">
    xxx
  </div>

轉為js變為如下:

{ name: '<div style="color:blue">\n  xxx\n</div>\n' }

2. 布林型:
布林值是使用true和false表示;如下程式碼:
isFlag: false

轉換成js變為如下:

{ isFlag: false }

其中 null 使用 ~ 表示; 如下程式碼:
obj: ~
轉為js變為如下:

{ obj: null }

3. 引用
錨點 & 和 別名 *, 可以用來引用,& 是用來建立錨點,<< 表示合併到當前資料,* 是用來引用錨點。 如下程式碼:

objects: &objects
  name: kongzhi
  age: 30

object2:
  name: longen0707
  <<: *objects

object3:
  name: tugenhua
  <<: *objects

轉換為js變為如下:

{ 
  objects: { name: 'kongzhi', age: 30 },
  object2: { name: 'longen0707', age: 30 },
  object3: { name: 'tugenhua', age: 30 } 
}

詳情demo 請看 http://nodeca.github.io/js-yaml/

相關文章