Skip to main content

One post tagged with "yml"

View All Tags

· 6 min read
zaxro

yaml and json

Yaml 跟 Json 都是用於日常進行資料處理,Json 相信大家很熟了,前後端資料溝通最常用到的就是 Json,因為他跟 python 的 dict 格式超像,所以熟悉 json 也很快,差別在前者是 python 物件,後者是有固定格式且方便機器解析的純文字的數據交換格式,規則是名稱寫在雙引號內,值可以是字符串、數字、對象、數組、布爾值或 null。

json基本範例
{
"name": "John",
"age": 30,
"city": "New York",
"hobbies": ["reading", "music", "sports"],
"isMarried": false,
"spouse": null
}

Yaml 相對於 Json 來說,對我個人而言,在表達複雜資料結構上,例如多層次的陣列,更好了解一些,主要使用縮排和簡潔的語法來表示結構和層次.

基本語法重點:

  • 有---開頭,通常就是 yml 格式,但沒強制要加
  • 使用縮排表示層級
  • 使用空格做縮排,,建議使用 2 或 4 個空格,不建議用 tab
  • 字符串不用加引號,在可能產生歧義時,需加單引號 or 雙引號.(單引號包圍字符串時,會將特殊符號保留。雙引號包圍字符串時,反斜線需要額外進行轉義。)
## 以下key3等於key4,注意使用單引號跟雙引號差別
- key3: '\.php$'
- key4: "\\.php$"
  • 支持多種數據類型,包括字典、列表、布爾值、整數、浮點數等。
  • 用# 註解

關於歧義這點,近一步說明: 使用 ":" 字符時,可能會被解析成 key-value 的形式,需要加引號來避免歧義。 字符串包含 "-" 字符時,可能被解析成列表中的項目,需要加引號來避免歧義。 字符串包含 "#" 字符時,可能被解析成注釋,需要加引號來避免歧義。

# 不用引號
key: value

# 需要加引號避免歧義
key: "value:with:colon"

# 需要加引號避免歧義
key: "value-with-dash"

# 不用引號(但是為了避免麻煩,遇到#都習慣加引號吧)
key: "#no-comments"

# 需要加引號避免歧義
key: "# comments"

yaml 數據結構

yml 支持多種數據類型,包括字典、列表、布爾值、整數、浮點數等.

這邊建議可以安裝 yq 把 yml 解析成 json,方便習慣用 json 得人了解 yml.

pip3 install yq

接下來會了解字典、列表、Boolean、整數、浮點數如何表達,以下的 yml 用法跟出現的 json 是相同意思的!

字典

以下二者相等

yaml dict
name: Helloworld;
json dict
{
"name": "junmajinlong"
}

列表

yaml list
---
- lang1: Shell
- lang2: JS
- lang3: Python

json list
[{ mylang: "Shell" }, { mylang2: "JS" }, { mylang3: "Python" }];

boolean

yaml boolean
is_published: true;
is_featured: false;
json boolean
{
"is_active": true,
"is_admin": false
}

yml 的 dict 跟 list 混合表達

這個格式在 docker 跟 ansible 之類很常見,其實他是這樣滴!

yaml dict and list
---
# 值是純list,有三個-,所以有三個元素.
languages:
- Shell
- JS
- Python

# 值是dict in list,因為只有一個-,代表只有一個元素,該元素type為dict.
services:
- name: nginx
status: running
json dict and list
{
"languages": [
"Shell",
"JS",
"Python"
]
}
{
"services": [
{
"name": "nginx",
"status": "running"
}
]
}

到這邊,基本上對 yml 就有一定熟悉度,在寫 config 時,腦袋也跟著跑出 json 的檔案範例.