YAML第一章 基本概念及语法
YAML第一章 基本概念及語法
簡介
本文對YAML的基本概念及語法進(jìn)行了詳細(xì)的分析,尤其是對YAML的語法進(jìn)行了詳細(xì)的闡述,旨在希望通過本文能對YAML有一個(gè)基本的了解,能夠書寫YAML文檔。
聲明
本文中的內(nèi)容屬于個(gè)人總結(jié)整理而來,個(gè)人水平有限,對于部分細(xì)節(jié)難免有理解錯(cuò)誤及遺漏之處,如果您在閱讀過程中有所發(fā)現(xiàn),希望您能指正,同時(shí)文章中的部分內(nèi)容也參考了其它大神的文章,如果文章中的內(nèi)容侵犯了您的權(quán)益,表示非常歉意,請您指出,我將盡快修改。
如果您進(jìn)行轉(zhuǎn)載,請標(biāo)明出處。
YAML學(xué)習(xí)筆記一 YAML基本概念及語法(http://www.liyubin.com/articles/2019/03/14/1552529532355.html)
YAML基本概念
1. YAML簡介
YAML,是一個(gè)可讀性高,用來表達(dá)資料序列的編程語言。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式。目YAML是”YAML Ain’t a Markup Language”(YAML不是一種置標(biāo)語言)的遞歸縮寫。在開發(fā)的這種語言時(shí),YAML 的意思其實(shí)是:”Yet Another Markup Language”(仍是一種置標(biāo)語言),但為了強(qiáng)調(diào)這種語言以數(shù)據(jù)做為中心,而不是以置標(biāo)語言為重點(diǎn),而用返璞詞重新命名。
YAML官方文檔中給的定義很簡單,即:“YAML Ain’t Markup Language” (abbreviated YAML) is a data serialization language designed to be human-friendly and work well with modern programming languages for common everyday tasks. This specification is both an introduction to the YAML language and the concepts supporting it; it is also a complete reference of the information needed to develop applications for processing YAML.
2. YAML VS XML,YAML VS Json,…
網(wǎng)上有很多關(guān)于這類的文章的描述,不過多介紹,有興趣的可以自行搜索比較,看看各路大神對YAML的分析
3. YAML不足
YAML沒有自己的數(shù)據(jù)類型的定義,而是使用實(shí)現(xiàn)語言的數(shù)據(jù)類型。一個(gè)YAML文件,在不同語言中解析后得到的數(shù)據(jù)類型可能會不同,由于其兼容性問題,不同語言間的數(shù)據(jù)流轉(zhuǎn)不建議使用YAML。
YAML基本語法
1. YAML語法
-
基本格式要求
- YAML使用可打印的Unicode編碼作為標(biāo)準(zhǔn)字符編碼,可以使用UTF-8或者UTF-16
- YAML對于大小寫是敏感的
- YAML文件使用.yaml做為后綴
- YAML使用縮進(jìn)代表層級關(guān)系,同時(shí)縮進(jìn)只能使用空格,不能使用tab鍵(推薦:在各種語言中為了使用代碼統(tǒng)一,可以在各編輯器中設(shè)置使用空格來替換Tab,一般使用4個(gè)空格),對于空格的數(shù)量沒有特別的要求,但相同的層級在左對齊
-
基本類型
-
內(nèi)置類型
類型表示方法備注 整數(shù) !!int 可使用10進(jìn)制,2進(jìn)制,8進(jìn)制,16進(jìn)制表示 浮點(diǎn)數(shù) !!float — 布爾 !!bool 可以是True,true,tRue,False等,忽略大小寫 字符串 !!str 復(fù)雜的情況下可以文本塊 二進(jìn)制 !!binary 也是字符串類型 日期時(shí)間 !!timestamp 采用ISO8601格式 空值 !! — 集合 !!set — 序列 !!seq ---- 鍵值表 !!map 鍵是唯一的 鍵值列表 !!omap — 對象列表 !!pairs — 特別指出:對于二進(jìn)制類型來說本質(zhì)是上一個(gè)base64的文本塊,如:
picture: !!binary |R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmleECcgggoBADs= -
常量值
表示單個(gè)的,不可再分的值,主要的結(jié)構(gòu)有:整數(shù),浮點(diǎn)數(shù),字符串,NULL,日期,布爾,時(shí)間
布爾型類型:
值為true/false,完全忽略大小寫 isstudent: trUe浮點(diǎn)數(shù):
固定小數(shù): pi: 3.1415926科學(xué)計(jì)數(shù)法表示: pi: 31415926e-8負(fù)無窮: minmin: -.inf無效數(shù)字: notnum: .NaN整型值:可以使用10進(jìn)制、2進(jìn)制、8進(jìn)制、16進(jìn)制表示
10進(jìn)制: intvalue: 1232進(jìn)制: intvalue: 0b1010_10108進(jìn)制: intvalue: 0o3416進(jìn)制: intvalue: 0xFFFF字符串/文本塊:
strvalue: newline字符串類的值,也可以使用單引號或雙引號,若字符串中包含有空格或者特殊字符,則必須使用單引號或者雙引號,雙引號與單引號還有不同,雙引號不會對特殊字符轉(zhuǎn)義,若單引號之中還有單引號,則必須連續(xù)使用兩個(gè)單引號轉(zhuǎn)義 字符串可以拆成多行,每一行會被轉(zhuǎn)成一個(gè)空格,對于多行字符串可以使用|保留換行符,也可以使用>折疊換行,使用+表示保留文字塊末尾的換行,使用-表示刪除字符串末尾的換行 字符串也可以HTML標(biāo)記strvalue: 'new\nline' 使用單引號相當(dāng)于{ strvalue: 'new\\nline' }strvalue: "new\nline" 使用雙引號相當(dāng)于{ strvalue: 'new\nline' },雙引號不會對特殊字符轉(zhuǎn)義strvalue: newline 字符串可以拆成多行,每一行會被轉(zhuǎn)成一個(gè)空格,相當(dāng)于{ strvalue: 'new line' }strvalue: |newline 使用|來表示需要保留換行符,相當(dāng)于{ strvalue: 'new\nline\n' }strvalue: >newline 使用>折疊換行,相當(dāng)于{ strvalue: 'new line\n' }strvalue: |+newline 使用+表示保留末尾的換行,相當(dāng)于{ strvalue: 'new\nline\n' }strvalue: |-newline 使用-表示刪除末尾的換行,相當(dāng)于{ strvalue: 'new\nline' }strvalue: |<p style="color: red">newline</p> 相當(dāng)于{ strvalue: '<p style="color: red">\n newline\n</p>\n' }日期類型:
日期必須使用ISO 8601格式,即:yyyy-MM-dd date: 2019-03-13時(shí)間類型:
時(shí)間使用ISO 8601格式,時(shí)間和日期之間使用T連接,使用+或者-代表時(shí)區(qū) datetime: 2019-03-13T20:49:33+08:00NULL類型:
使用~表示null nullvalue: ~相當(dāng)于{ nullvalue: null } -
鍵值表、映射、哈希、字典
鍵值對的集合,使用冒號(: )代表,格式為key: value,需要注意的是冒號后面需要添加一個(gè)空格,如:
Block style: !!mapClark : EvansBrian : IngersonOren : Ben-Kiki Flow style: !!map { Clark: Evans, Brian: Ingerson, Oren: Ben-Kiki }相當(dāng)于{ 'Block style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' },'Flow style': { Clark: 'Evans', Brian: 'Ingerson', Oren: 'Ben-Kiki' } }當(dāng)鍵是一個(gè)列表或者鍵值表時(shí),需要使用問號(? )表示復(fù)雜的鍵,如:
? - blue- red- green : Color也可以使用流式表示 ? [blue, reg, green]: Color相當(dāng)于:{ 'blue,red,green': 'Color' } -
數(shù)組、序列、列表
一組按次序排列的值,使用短橫線(- )代表數(shù)組,格式為- value,需要注意的短橫線后面需要添加一個(gè)空格,如:
student:- jone- steven- bob數(shù)組可以使用復(fù)雜的類型,比如:
classes:- id: 1001name: joneage: 12- id: 1002name: stevenage: 14-id: 1003name: bobage: 15數(shù)組中復(fù)雜的類型,也可以使用流式(flow)方式表示,如:
classes: [{id: 1001, name: jone, age: 12},{id: 1002, name: steven, age: 14},{id: 1003, name: bob,age: 15}]
-
-
注釋
YAML中使得#做為注釋,從這個(gè)字符一直到行尾,都會被忽略
-
文檔開始與結(jié)束符
使用三個(gè)短橫線(—),表示一個(gè)文檔的開始,一般情況下在同一個(gè)文件中有有多個(gè)時(shí)使用
比如: ```--- id: 1001 name: jone age: 12 ... --- id: 1002 name: steven age: 14 ...```
使用三個(gè)點(diǎn)號(…),表示一個(gè)文檔的結(jié)束,一般情況下和—共同使用。尤其是對于網(wǎng)絡(luò)傳輸或者流來說,作為明確的結(jié)束符號有利于軟件的處理。 -
類型強(qiáng)制轉(zhuǎn)換
可以使用雙感嘆號(!!),表示需要進(jìn)行類型轉(zhuǎn)換,如:
使用!!str將整型及bool型強(qiáng)制轉(zhuǎn)成字符串string:- !!str 123456- !!str true具體的內(nèi)置類型可以參看上述的類型描述中
-
引用
可以使用&符號來定義描點(diǎn),可以使用*來引用定義的描點(diǎn),可以使用<<來合并到當(dāng)前數(shù)據(jù)中,如:
defaults: &defaults adapter: postgres host: localhostdevelopment:database: myapp_development<<: *defaultstest:database: myapp_test<<: *defaults相當(dāng)于defaults:adapter: postgreshost: localhostdevelopment:database: myapp_developmentadapter: postgreshost: localhosttest:database: myapp_testadapter: postgreshost: localhost -
指令符號
在單一的文檔中可以使用指導(dǎo)指令,一般情況下定義在文檔的開始早于開始符號(—),使用百分比符號(%),在YAML1.1中定義了兩個(gè)指導(dǎo)指令:
- %YAML 指導(dǎo)指令,用來識別文件的YAML版本號,放在文檔的首行
- %TAG 指導(dǎo)指令,被用在URI的字首標(biāo)記,這個(gè)方法在標(biāo)記節(jié)點(diǎn)的型態(tài)時(shí)相當(dāng)有用
TODO:有待進(jìn)一步補(bǔ)充
-
自定義類型或標(biāo)識
可以使用單個(gè)感嘆號(!)表示自定義類型
TODO:有待進(jìn)一步補(bǔ)充
2. YAML各種語言的實(shí)現(xiàn)
YAML語言已經(jīng)有了多種語言的實(shí)現(xiàn),具體的參見YAML官網(wǎng),此處將會重點(diǎn)介紹一下C#中YAML的實(shí)現(xiàn)。
章節(jié)
- YAML學(xué)習(xí)筆記 總章
- 第一章 YAML基本概念及語法
- 第二章 YAML與Unity
- 第三章 C#解析YAML
參考資料
- YAML 技術(shù)研究
- YAML官網(wǎng)
- YAML Tutorial
- YAML快速入門
- YAML詳解 是什么
- 通過一篇YAML來學(xué)習(xí)YAML
- YAML在線格式化校驗(yàn)工具
總結(jié)
以上是生活随笔為你收集整理的YAML第一章 基本概念及语法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统集成项目管理工程师教程 第二版下载,
- 下一篇: 色系表