YAML (Yet Another Markup Language) - Kummer話你知

YAML是什么 (Yet Another Markup Language)

YAML是一個標記語言,讀音"yamel",或者"雅梅爾"。

解決什么問題

類似于其他的標記語言一樣,YAML希望能提供一個標準格式,用來存儲復雜的結構化數(shù)據(jù),YAML的設計者希望YAML能滿足下面幾個條件:

  • 這些數(shù)據(jù)能方便機器的處理:
  1. 表達能力強:適合于表示程序中的數(shù)據(jù)結構。
  2. 程序解析簡單:能讓程序簡單快速的從文件中恢復數(shù)據(jù)。
  • 這些數(shù)據(jù)要方便人的處理:
  1. 書寫簡潔。
  2. 閱讀方便。

**用途: ** 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支持兩種方式

  1. 一種是使用類JSON的輔助括號來表示嵌套關系,比如用{}表示一個對象,用[]表示一個數(shù)組
  2. 使用類似于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}}]
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 對于簡單的文件,唯一的結構層次是間隔的行。然而有時需要更加結構化的文本,用于后續(xù)使用的程序保存數(shù)據(jù)或者向另一個程序...
    碼農(nóng)小楊閱讀 3,265評論 0 2
  • 已經(jīng)很久沒有寫東西,我說過,找不到自己的時候可以寫寫日記。 有時候分不清夢境與現(xiàn)實,分不清想要的和必須要的。如果可...
    黛綠未央閱讀 263評論 0 1
  • 鰉魚島初步得到了當?shù)鼐用竦恼J可,認為開發(fā)當?shù)貚u嶼是趨勢,而且是民心所向,而且今天攀談的是一位在島上開小賣店的居民,...
    龍騰虎躍江一龍閱讀 252評論 0 1
  • 經(jīng)過這幾天和挑戰(zhàn)語音60秒見習群老成員幾番討論之后,終于制定了一個比較人性化,監(jiān)督性強,活躍度高,學習環(huán)境優(yōu)越的群...
    tang小米閱讀 584評論 0 1

友情鏈接更多精彩內(nèi)容