背景
日常工作中,項目編程免不了需要使用配置文件,早期yaml出現之前,大部分配置文件采用xml形式,但是以xml格式儲存的數據要比以其他格式(如json、yaml)儲存占有的空間要大得多,因為它除了要保存原始數據外還需要保存元數據進行描述。不管你是否相信,筆者曾經在項目中看到xml文件中大量冗余的標簽,真的是眼花繚亂,幸運的是,當看見yaml的那一刻,筆者真實地感受到上帝來解救處于水深火熱中的那一幫經常與配置文件打交道的程序員了。本文筆者將根據在項目中對yaml的應用簡單介紹yaml這樣一種讓愛程序員愛不釋手的數據串行化格式。
簡介
與json、xml一樣,yaml也是一種通用的數據串行化格式,其設計目標就是方便開發人員的讀寫,yaml可以表示對象、數組、純量三種數據格式。
yaml規范
- 大小寫敏感
- 使用縮進表示層級
- 縮進的空格數不重要,但是相同層級的元素左側需要對齊
對象
鍵值對組合,又稱哈希,對象的一組鍵值對用冒號分割,注意冒號后面必須有空格
debug: true
轉換為JAVAScript如下
{"debug":true}
也可以將所有鍵值對寫在一個行內對象
db: {user: root, password: pass123}
轉換為JavaScript如下
{"db":{"user":"root", "password":"pass123"}}
數組
一組按次序排列的值,又稱序列,數組的每個元素都以連詞線“-”開頭,連詞線“-”后面必須有空格,如下
fruits:
- Apple
- pear
- banana
轉換為JavaScript后如下
{"fruits": ["apple", "pear", "banana"]}
也可以表示多維數組,如下
fruitsGroup:
-
- apple
- banana
-
- pear
轉換為JavaScript如下
{"fruitsGroup": [["apple", "banana"], ["pear"]]}
與對象一樣,數組也可以使用行內表示法,如下
fruits: [apple, banana, pear]
轉換為JavaScript如下
{"fruits":["apple", "banana", "pear"]}
復合結構
對象和數組可以結合使用,構成復合結構。如對象數組,每個對象的第一個屬性以連詞線“-”開頭,連詞線“-”后面必須要有空格
fruits:
- name: apple
color: red
- name: banana
color: yellow
轉換成JavaScript如下
{"fruits":[{"name":"apple", "color":"red"}, {"name":"banana", "color":"yellow"}]}
對象數組也可以使用行內表示法,如下
fruits: [{"name":"apple", "color":"red"}, {"name":"banana", "color":"yellow"}]
轉換為JavaScript如下
{"fruits":[{"name":"apple", "color":"red"}, {"name":"banana", "color":"yellow"}]}
純量
純量是單獨的、最基本的、不可再分的值,包括數值類型(整數、浮點數)、布爾類型、日期時間類型、null類型,字符串類型。
數值直接以字面量的形式表示,如下
weight: 1.0
轉換為JavaScript如下
{"weight": 1.0}
布爾值包括true與false,如下
enabled: true
disabled: false
轉換為JavaScript如下
{"enabled":true, "disabled":false}
null用~表示,如下
name: ~
轉換為JavaScript如下
{"name": null}
日期、時間采用ISO8601格式,如下
date: 2021-06-18T18:00:00+08:00
date1: 2020-06-18
轉換為JavaScript如下
{"date": new Date('2021-06-18T18:00:00+08:00'), "date1":new Date('2020-06-18')}
字符串
字符串默認不使用引號,如下
profile: test
如果字符串中包含特殊字符或空格,需要放在引號之中,其中單引號不會對特殊字符轉義,雙引號會對特殊字符轉義,如下
c1: '這是一個n測試'
c2: "這是一個n測試"
轉換為JavaScript如下
{"c1":"這是一個\n測試", "c2":"這是一個n測試"}
單引號之中如果還有單引號,需要連續使用兩個單引號轉義,如下
content: 'that''s all right'
轉換為JavaScript如下
{"content": "that's all right"}
字符串可以寫成多行,從第二行開始,每一行必須以空格縮進,換行會被轉換成空格,如下
content: this
is
test
轉換為JavaScript如下
{"content": "this is test"}
多行字符串可以使用"|"保留換行符,或者使用">"折疊換行符,如下
c1: |
thank
you
c2: >
thank
you
轉換成JavaScript如下
{'c1': 'thanknyoun', 'c2': 'thank youn'}
"|"后面使用"+"可以保留字符串末尾的換行(默認只保留字符串末尾的第一個換行),"-"可以刪除字符串末尾的換行,如下
c1: |+
thank
you
c2: |-
thank
you
轉換成JavaScript如下
{'c1': 'thanknyounn', 'c2': 'thank you'}
引用
可以使用錨點"&"和別名"*"來使用yaml中的引用功能,其中"&"用于定義錨點,別名"*"用來引用錨點,如下,"<<"表示合并到當前數據
common: &common
user: zhangsan
password: 123456
test:
profile: test
<<: *common
dev:
profile: dev
<<: *common
等價于下面
common: &common
user: zhangsan
password: 123456
test:
profile: test
user: zhangsan
password: 123456
dev:
profile: dev
user: zhangsan
password: 123456
類似的,純量也可以使用錨點,如下
- &fruit apple
- banana
- pear
- *fruit
轉換為JavaScript如下
['apple', 'banana', 'pear', 'apple']
總結
從上面的案例可以看出yaml相對于傳統的xml更簡潔,可讀性更強,目前筆者所在的項目基本全部采用yaml格式的配置文件,看起來清爽多了。關于yaml的相關用法,讀者朋友如果有更多的認識,歡迎文章下方評論,共同學習共同進步。