YAML 使用

Undefined443發表於2024-06-06

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"  # 強制轉換為布林值

字串

  • 字串預設不使用引號表示,但是如果字串中包含空格或特殊字元,就必須使用引號。
  • 單引號和雙引號的區別在於:
    1. 雙引號內部可以使用變數,單引號內部不能使用變數;
    2. 單引號不會對特殊字元進行轉義,雙引號會對特殊字元進行轉義。
# 單引號不會轉義特殊字元
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);
}

相關文章