YAML 語言教程 | 阮一峰的網路日誌
YAML Reference
YAML Tutorial | Tutorials Point
- YAML (/ˈjæməl/)
- YAML Ain't Markup Language
基礎元素
物件
# 寫法一
animal: pets
# { "animal": "pets"}
# 寫法二
hash: { name: Steve, foo: bar }
# { "hash": { "name": "Steve", "foo": "bar" } }
- 註釋中給出的是對應的 JSON 的寫法
和 JSON 一樣,整個 YAML 檔案是一個物件
陣列
# 寫法一
- Cat
- Dog
- Goldfish
# [ "Cat", "Dog", "Goldfish" ]
# 寫法二
animal: [Cat, Dog]
# { "animal": [ "Cat", "Dog" ] }
純量 (scalar)
最基本的、不可再分的值。
name: Steve # 字串
age: 18 # 整數
pi: 3.14 # 浮點數
isMale: true # 布林值
isSingle: null # null,也可以寫成 ~
birthday: 1999-12-31 # 日期,ISO 8601 格式
time: 12:00:00 # 時間,ISO 8601 格式
ISO 8601 格式:
- 日期
YYYY-MM-DD
- 時間
hh:mm:ss
- 日期和時間
YYYY-MM-DDThh:mm:ss
- 日期和時間,帶時區
YYYY-MM-DDThh:mm:ss±hh:mm
2001-12-14t21:59:43.10-05:00
表示 2001 年 12 月 14 日 21 點 59 分 43.10 秒,美國東部時間 5 個小時以前。
強制型別轉換
a: !!str 123 # 強制轉換為字串
b: !!int "123" # 強制轉換為整數
c: !!float "123" # 強制轉換為浮點數
d: !!bool "true" # 強制轉換為布林值
字串
- 字串預設不使用引號表示,但是如果字串中包含空格或特殊字元,就必須使用引號。
- 單引號和雙引號的區別在於:
- 雙引號內部可以使用變數,單引號內部不能使用變數;
- 單引號不會對特殊字元進行轉義,雙引號會對特殊字元進行轉義。
# 單引號不會轉義特殊字元
s1: 'aaa\nbbb'
s2: "aaa\nbbb"
# { "s1": "aaa\\nbbb", "s2": "aaa\nbbb" }
# 單引號中如果還有單引號,需要使用兩個單引號表示
str: 'labor''s day'
# { 'str': 'labor\'s day' }
# 字串可以寫成多行,後續行必須有一個單空格縮排。換行符會被轉為空格
str: line1
line2
line3
# { "str": "line1 lin2 line3" }
# 使用 | 保留換行符,> 摺疊換行
s1: |
line1
line2
s2: >
line1
line2
# { "s1": "line1\nline2\n", "s2": "line1 line2\n" }
# 使用 + 保留文字塊末尾的換行,- 刪除文字塊末尾的換行
s1: |
Foo
s2: |+
Foo
s3: |-
Foo
# { "s1": "Foo\n", "s2": "Foo\n\n\n", "s3": "Foo" }
引用
錨點 &
和 別名 *
,可以用來引用
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
另一個例子
- &showell Steve
- Clark
- Brian
- Oren
- *showell
# [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
函式和正規表示式的轉換
JS-YAML 庫特有的功能,可以把函式和正規表示式轉為字串。
example.yml
fn: function () { return 1 }
reg: /test/
解析上面的 yml 檔案的程式碼如下:
const yaml = require('js-yaml');
const fs = require('fs');
try {
let doc = yaml.load(
fs.readFileSync('./example.yml', 'utf8')
);
console.log(doc);
} catch (e) {
console.log(e);
}
從 JavaScript 物件還原到 yml 檔案的程式碼如下:
const yaml = require('js-yaml');
const fs = require('fs');
let obj = {
fn: function () { return 1 },
reg: /test/
};
try {
fs.writeFileSync('./example.yml', yaml.dump(obj), 'utf8');
} catch (e) {
console.log(e);
}