YAML 官方文檔:https://yaml.org/
1 簡介
YAML("YAML Ain't a Markup Language",YAML 不是標記語言)是一種數(shù)據(jù)序列化語言厨埋,旨在對人類友好邪媳,并且可以與現(xiàn)代編程語言很好地配合日常日常工作。
開放荡陷,可互操作且易于理解的工具極大地提高了計算能力雨效。YAML 從一開始就被設(shè)計為對使用數(shù)據(jù)的人員有用且友好。 它使用 Unicode 可打印字符废赞,其中一些字符提供結(jié)構(gòu)信息徽龟,其余字符包含數(shù)據(jù)本身。YAML 通過最大程度地減少結(jié)構(gòu)特征的數(shù)量并允許數(shù)據(jù)以自然而有意義的方式展示自身唉地,從而實現(xiàn)了獨特的清潔度据悔。例如,縮進可以用于結(jié)構(gòu)耘沼,冒號用于分隔key: value
對和 -
用于創(chuàng)建“項目符號”列表极颓。
數(shù)據(jù)結(jié)構(gòu)有無數(shù)種形式,但是它們都可以用三個基本結(jié)構(gòu)表示:映射(哈希/字典)群嗤,序列(數(shù)組/列表)和標量(字符串/數(shù)字)菠隆。YAML 利用了這些基本結(jié)構(gòu),并添加了簡單的 typing
系統(tǒng)和別名機制來形成用于序列化任何 native 數(shù)據(jù)結(jié)構(gòu)的完整語言。盡管大多數(shù)編程語言都可以使用 YAML 進行數(shù)據(jù)序列化骇径,但是 YAML 擅長使用那些基本上圍繞三個基本原語構(gòu)建的語言躯肌。這些包括新的敏捷語言,例如 Perl既峡,Python羡榴,PHP,Ruby 和 Javascript运敢。
YAML 還是專門為在常見的用例(如配置文件校仑,日志文件,進程間消息傳遞传惠,跨語言數(shù)據(jù)共享迄沫,對象持久性以及復(fù)雜數(shù)據(jù)結(jié)構(gòu)的調(diào)試)提供支持。當(dāng)數(shù)據(jù)易于查看和理解時卦方,編程將變得更加簡單羊瘩。
1.1 目標
YAML 的設(shè)計目標是降低復(fù)雜性:
- YAML 易于人類閱讀。
- YAML 數(shù)據(jù)可在編程語言之間移植盼砍。
- YAML 與敏捷語言的本機數(shù)據(jù)結(jié)構(gòu)匹配尘吗。
- YAML 具有一致的模型來支持通用工具。
- YAML 支持 one-pass 處理浇坐。
- YAML 具有表現(xiàn)力和可擴展性睬捶。
- YAML 易于實現(xiàn)和使用。
1.2 語言特性
YAML 基于縮進的作用域與 Python 相似(沒有制表符引起的歧義)近刘∏苊常縮進的塊便于檢查數(shù)據(jù)結(jié)構(gòu)。YAML 的文字風(fēng)格利用了這一點觉渴,可以使格式化的文本在縮進的結(jié)構(gòu)中干凈地混合在一起介劫,而不會產(chǎn)生麻煩的轉(zhuǎn)義。YAML 還允許使用類似于 JSON 和 Perl 的基于指標的傳統(tǒng)范圍案淋。這樣的流內(nèi)容可以自由地嵌套在縮進的塊中座韵。
YAML 的雙引號樣式使用了熟悉的 C 樣式轉(zhuǎn)義序列。這將啟用不可打印或 8 位(ISO 8859-1)字符(例如"\x3B")的 ASCII 編碼踢京。 轉(zhuǎn)義序列(例如 “\u003B” 和 “\U0000003B”)支持不可打印的 16 位 Unicode 和 32 位(ISO / IEC 10646)字符回右。
受 HTML 的行尾規(guī)范化影響,YAML 的行折疊采用了一種直觀的方法來處理換行符漱挚。單個換行符被折疊到一個空格中,而空行則被解釋為換行符渺氧。此技術(shù)允許對段落進行單詞包裝旨涝,而不會影響標量內(nèi)容的規(guī)范形式。
YAML 的核心類型系統(tǒng)基于 Perl,Python 和 Ruby 等敏捷語言的要求白华。YAML 直接支持集合(映射慨默,序列)和標量。對這些通用類型的支持使程序員可以將其語言的本機數(shù)據(jù)結(jié)構(gòu)用于 YAML 操作弧腥,而不需要特殊的文檔對象模型(DOM)厦取。
與 XML 的 SOAP 一樣,YAML 支持通過別名機制對 native 數(shù)據(jù)結(jié)構(gòu)圖進行序列化管搪。與 SOAP 一樣虾攻,YAML 也提供了應(yīng)用程序定義的類型。這使 YAML 可以代表現(xiàn)代分布式計算所需的豐富數(shù)據(jù)結(jié)構(gòu)更鲁。YAML 使用受 Java 的基于 DNS 的軟件包命名約定和 XML 的基于 URI 的命名空間啟發(fā)的命名空間機制來提供全局唯一類型名稱霎箍。另外,YAML允許特定于單個應(yīng)用程序的私有類型澡为。
YAML旨在支持增量接口漂坏,該接口包括輸入(getNextEvent
)和輸出(sendNextEvent
)one-pass 接口。 這些特性共同使 YAML 支持大型文檔(例如交易日志)或連續(xù)流(例如來自生產(chǎn)機器的提要)的處理媒至。
1.3 PyYaml
官方推薦的 YAML 文件擴展名是 .yaml
或者 .yml
顶别。 Python 中有兩個用于 YAML 的模塊:PyYAML 和 ruamel.yaml。在本教程中拒啰,我們使用前者驯绎。
YAML 支持三種基本數(shù)據(jù)類型:標量(例如字符串,整數(shù)和浮點數(shù))图呢,列表和關(guān)聯(lián)數(shù)組条篷。
安裝:
pip install pyyaml
2 基本語法
- 大小寫敏感
- 使用縮進表示層級關(guān)系
- 縮進不允許使用 tab,只允許空格
- 縮進的空格數(shù)不重要蛤织,只要相同層級的元素左對齊即可
-
#
表示注釋
2.1 數(shù)據(jù)類型
YAML 支持以下幾種數(shù)據(jù)類型:
- 對象:鍵值對的集合赴叹,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
- 數(shù)組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
- 標量(scalars):單個的指蚜、不可再分的值
2.2 YAML 對象
對象鍵值對使用冒號結(jié)構(gòu)表示 key: value
乞巧,冒號后面要加一個空格。也可以使用 key:{key1: value1, key2: value2, ...}
摊鸡。還可以使用縮進表示層級關(guān)系:
key:
child-key: value
child-key2: value2
較為復(fù)雜的對象格式绽媒,可以使用問號加一個空格代表一個復(fù)雜的 key
,配合一個冒號加一個空格代表一個 value
:
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
意思即對象的屬性是一個數(shù)組 [complexkey1,complexkey2]
免猾,對應(yīng)的值也是一個數(shù)組 [complexvalue1,complexvalue2]
是辕。
2.3 YAML 數(shù)組
以 -
開頭的行表示構(gòu)成一個數(shù)組:
- A
- B
- C
YAML 支持多維數(shù)組,可以使用行內(nèi)表示:
key: [value1, value2, ...]
數(shù)據(jù)結(jié)構(gòu)的子成員是一個數(shù)組猎提,則可以在該項下面縮進一個空格:
-
- A
- B
- C
一個相對復(fù)雜的例子:
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
意思是 companies 屬性是一個數(shù)組获三,每一個數(shù)組元素又是由 id、name、price 三個屬性構(gòu)成疙教。
數(shù)組也可以使用流式(flow)的方式表示:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
2.4 復(fù)合結(jié)構(gòu)
數(shù)組和對象可以構(gòu)成復(fù)合結(jié)構(gòu)棺聊,例:
languages:
- Ruby
- Perl
- Python
websites:
YAML: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
轉(zhuǎn)換為 JSON:
{
languages: [ 'Ruby', 'Perl', 'Python'],
websites: {
YAML: 'yaml.org',
Ruby: 'ruby-lang.org',
Python: 'python.org',
Perl: 'use.perl.org'
}
}
也可以是:
-
name: Mark McGwire
hr: 65
avg: 0.278
-
name: Sammy Sosa
hr: 63
avg: 0.288
或者
- [name , hr, avg ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa , 63, 0.288]
或者
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
hr: 63,
avg: 0.288
}
2.5 標量
標量是最基本的,不可再分的值贞谓,包括:字符串限佩、布爾值、整數(shù)裸弦、浮點數(shù)祟同、Null、時間烁兰、日期耐亏。
使用一個例子來快速了解標量的基本使用:
boolean:
- TRUE #true,True都可以
- FALSE #false,F(xiàn)alse都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科學(xué)計數(shù)法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二進制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用雙引號或者單引號包裹特殊字符
- newline
newline2 #字符串可以拆成多行沪斟,每一行會被轉(zhuǎn)化成一個空格
date:
- 2018-02-17 #日期必須使用ISO 8601格式广辰,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #時間使用ISO 8601格式,時間和日期之間使用T連接主之,最后使用+代表時區(qū)
YAML’s flow scalars include the plain style (most examples thus far) and two quoted styles. The double-quoted style provides escape sequences. The single-quoted style is useful when escaping is not needed. All flow scalars can span multiple lines; line breaks are always folded.
3 Structures
YAML 使用 ---
分隔文本上下文择吊,...
標識上下文的結(jié)束(Three dots ( “...”) indicate the end of a document without starting a new one, for use in communication channels.):
3.1 引用
&
錨點和 *
別名,可以用來引用:
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
相當(dāng)于:
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
&
用來建立錨點(defaults)槽奕,<<
表示合并到當(dāng)前數(shù)據(jù)几睛,*
用來引用錨點。
下面是另一個例子:
- &showell Steve
- Clark
- Brian
- Oren
- *showell
轉(zhuǎn)換為 JavaScript 代碼如下:
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
4 Tags
In YAML, untagged nodes are given a type depending on the application. The examples in this specification generally use the seq, map and str types from the fail safe schema. A few examples also use the int, float, and null types from the JSON schema. The repository includes additional types such as binary, omap, set and others.
Explicit typing is denoted with a tag using the exclamation point (“!”) symbol. Global tags are URIs and may be specified in a tag shorthand notation using a handle. Application-specific local tags may also be used.