YAML是什么 (Yet Another Markup Language)
YAML是一個標記語言,讀音"yamel",或者"雅梅爾"。
解決什么問題
類似于其他的標記語言一樣,YAML希望能提供一個標準格式,用來存儲復雜的結構化數(shù)據(jù),YAML的設計者希望YAML能滿足下面幾個條件:
- 這些數(shù)據(jù)能方便機器的處理:
- 表達能力強:適合于表示程序中的數(shù)據(jù)結構。
- 程序解析簡單:能讓程序簡單快速的從文件中恢復數(shù)據(jù)。
- 這些數(shù)據(jù)要方便人的處理:
- 書寫簡潔。
- 閱讀方便。
**用途: ** YAML經(jīng)常用在數(shù)據(jù)的交換與存儲方面,特別是這些數(shù)據(jù)同時需要人和機器都去訪問的時候。比如配置文件、模型元數(shù)據(jù)文件等方面。
相關技術比較
從上面我們可以看出,YAML要解決的問題實際上與XML和JSON等技術一樣,那既然有了XML和JSON,為什么還需要YAML呢?
我想在機器處理上,XML和JSON應該都沒有太大的短板,最大的問題在于方便人的處理上,比如XML,任何一個數(shù)據(jù)前后都要加上一個標簽,這樣對于人來說太繁瑣。
XML格式的描述
<name> sina </name>
<url> www.sina.com </url>
YAML格式的描述,顯然YAML格式對人來說更友好一些
name:sina
url:www.sina.com
說明: 另外,對于嵌套數(shù)據(jù)結構,YAML支持類似于Python的方式,使用縮進來代替Json或XML的各種括號或標簽,在可閱讀性方面有很大的改善。
技術細節(jié)
實驗地址:http://nodeca.github.io/js-yaml/
注: 上面的網(wǎng)站提供將YAML轉換為JSON的在線工具。
在開始介紹YAML詳細的語法前,我們先看一個例子,描述了幾門程序設計語言課程與老師的信息,大家看看,即使不知道YAML語法,是不是大概也能猜出下面一段YAML說明了什么信息?
Lessons:
- Title: Ruby
Teacher:
Name: Jack
Age: 36
- Title: Python
Teacher:
Name: Tom
Age: 37
- Title: Go
Teacher:
Name: Frank
Age: 38
1. 注釋:
這是在YAML中使用#進行行注釋
2. 存儲數(shù)據(jù)- 基本類型
基本類型包括字符串型,數(shù)值型,bool型,空型,日期時間型等
2.1 字符串
str: 這是一個字符串 #不使用引號,默認使用這種方式
str: '這是一個字符串' #使用單引號,如果字符串中有空格或:等特殊符號,就需要使用這種方式
str: "這也是一個字符串" #使用雙引號,這種方式與前兩種的區(qū)別在于轉義字符的處理,比如\n '\n' "\n",無引號和單引號都表示兩個字符\和n,而雙引號表示一個字符,換行符。
2.2 多行字符串
默認行為:字符串可以寫成多行,從第二行開始,必須有一個單空格縮進。換行符會被轉為空格。
str: 這是
一個
多行
字符串
等價于json { str: '這是 一個 多行 字符串' }
保留換行: |
str: |
這是
一個
多行
字符串
等價于json { str: '這是\n一個\n多行\(zhòng)n字符串\n' }
折疊換行: >
str: >
這是
一個
多行
字符串
等價于json { str: '這是 一個 多行 字符串\n' }
末尾換行的去留: +(保留末尾換行) -(去除末尾換行)
str: >+
這是
一個
多行
字符串
str2: >-
這是
一個
多行
字符串
等價于json { str: '這是 一個 多行 字符串\n\n\n', str2: '這是 一個 多行 字符串' }
2.3 布爾值和空值
用true或false表示bool值,用~表示空值
2.4 整數(shù)和浮點數(shù)
整數(shù)或浮點數(shù),就直接使用文字量描述,如12 或 3.1415926
2.5 時間和日期
日期采用復合 iso8601 格式的年、月、日表示
時間采用 ISO8601 格式。
iso8601: 2001-12-14t21:59:43.10-05:00
date: 1976-07-31
2.6 強制類型轉換
YAML允許使用兩個!!來表示強制類型轉換,比如將bool類型的true轉換為字符串類型的true
strTrue: !!str true
等價于json strTrue: 'true'
3 復雜數(shù)據(jù)類型
復雜一點的數(shù)據(jù)類型包括數(shù)組和Key/Value對
3.1 Key/Value對
鍵值對用:隔開(注:冒號后面要加一個空格),多個key/value對可以用來描述一個對象,比如
name: kummer
age: 12
3.2 數(shù)組
連詞線開頭的連續(xù)幾行,則構成了一個數(shù)組,比如
pets:
- dog
- cat
4 嵌套數(shù)據(jù)結構
對于嵌套數(shù)據(jù)結構,YAML支持兩種方式
- 一種是使用類JSON的輔助括號來表示嵌套關系,比如用{}表示一個對象,用[]表示一個數(shù)組
- 使用類似于python的方式,利用縮進來表示嵌套關系,相同縮進的數(shù)據(jù)在一個層次上。
下面是一個完整的例子,Lessons和Lessons2分別用兩種方式描述了相同的信息,用縮進來表示嵌套關系似乎可讀性更好一些。
Lessons:
- Title: Ruby
Teacher:
Name: Jack
Age: 36
- Title: Python
Teacher:
Name: Tom
Age: 37
- Title: Go
Teacher:
Name: Frank
Age: 38
Lessons2: [{Title: Ruby,Teacher: {Name: Jack, Age: 36}},
{Title: Python,Teacher: {Name: Jack, Age: 37}},
{Title: Go,Teacher: {Name: Jack, Age: 38}}]