YAML詳解


 

1   YAML簡介

YAML,即YAML Ain’t Markup Language的縮寫,YAML 是一種簡潔的非標記語言。YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。

YAML的在線Demo這個YAML轉化JSON網頁中進行上手練習

2   YAML語法

  1. 大小寫敏感
  2. 使用縮進表示層級關系
  3. 禁止使用tab縮進,只能使用空格鍵
  4. 縮進長度沒有限制,只要元素對齊就表示這些元素屬於一個層級。
  5. 使用#表示注釋
  6. 字符串可以不用引號標注

3   YAML 組織結構

YAML 文件可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作為分隔符。同時,文檔也可以使用“...”(三個點號)作為結束符(可選)。如果只是單個文檔,分隔符“---”可省略。

4   YAML數據結構

YAML 支持的數據結構有三種:

  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值

4.1    對象

4.1.1        使用 “:”(冒號) + 空格表示單個鍵值對

對象的一組鍵值對,使用 “:”(冒號) + 空格表示單個鍵值對,格式為key: value。冒號后面要加一個空格

key: value

可以使用縮進表示層級關系;

key:

    child-key: value

child-key2: value2

key: {child-key: value, child-key2: value2}

4.1.2        使用"{}"表示一個鍵值表

items: {no: 1234, descript: cpu, price: ¥800.00}

4.1.3        "? " 問號+空格表示復雜的鍵

"? " 問號+空格表示復雜的鍵。當鍵是一個列表或鍵值表時,就需要使用本符號來標記。

  1.  # 使用一個列表作為鍵
  2.  ? [blue, reg, green]: Color
  3.  # 等價於
  4.  ? - blue
  5.    - reg
  6.    - gree
  7.  : Color



4.2    數組

使用一個短橫線加一個空格代表一個數組項:

hobby:

    - Java

    - LOL

當然也可以有這樣的寫法:

-

    - Java

    - LOL

可以簡單理解為:[[Java,LOL]]

數組的理解:

PaymentDetail:
  - billPaymentNo: "201904171022507929513877465876"
  - paymentAmount: 1000.00
  - paymentMethod1: "ODD"
  - paymentSuccessDate: 2019-04-17 13:00:00

轉為json如下:

PaymentDetail:[{billPaymentNo: '201904171022507929513877465876' },{paymentAmount: 1000 },{paymentMethod1: 'ODD' },{paymentSuccessDate: Wed Apr 17 2019 21:00:00 GMT+0800 (China Standard Time)}]

理解為:PaymentDetail值為一個列表,列表中有四個元素,其中每個元素都是一個字典,每個字典中只有一個鍵值對

 

PaymentDetail1:
  - billPaymentNo: "201904171022507929513877465876"
    paymentAmount: 1000.00
    paymentMethod1: "ODD"
    paymentSuccessDate: 2019-04-17 13:00:00

轉為json如下:

PaymentDetail1: [{billPaymentNo:'201904171022507929513877465876',paymentAmount: 1000, paymentMethod1: 'ODD',paymentSuccessDate: Wed Apr 17 2019 21:00:00 GMT+0800 (China Standard Time)}]

理解為:PaymentDetail1值為一個列表,列表中只有一個元素,該元素為一個字典,字典由多個鍵值對構成

4.3    復合結構

對象和數組可以結合使用,形成復合結構。

2. languages:

  1.   - Ruby
  2.   - Perl
  3.   - Python

6. websites:

  1.   YAML: yaml.org
  2.   Ruby: ruby-lang.org
  3.   Python: python.org
  4.   Perl: use.perl.org

轉為 JavaScript 如下。

 

  1. { languages: [ 'Ruby', 'Perl', 'Python' ],
  2.   websites:
  3.    { YAML: 'yaml.org',
  4.      Ruby: 'ruby-lang.org',
  5.      Python: 'python.org',
  6.      Perl: 'use.perl.org' } }

4.4    純量

純量是最基本的、不可再分的值。以下數據類型都屬於純量:

l  字符串

l  布爾值

l  整數

l  浮點數

l  Null

l  時間

l  日期

4.5    特殊用法

4.5.1        !! YAML中使用!!做類型強行轉換:

yamlbeans包一般用!(單嘆號)做類型轉換,snakeyaml包一般用!!(雙嘆號)做類型轉換

string:

    - !!str 54321

    - !!str true

相當於把數字和布爾類型強轉為字符串。當然允許轉型的類型很多,比如:

--- !!set

- Mark McGwire: 65

- Sammy Sosa: 63

- Sammy Sosa: 63

- Ken Griffy: 58

將數組解析為set,轉化的內容就是:[{Ken Griffy=58}, {Mark McGwire=65}, {Sammy Sosa=63}],重復的Sammy Sosa去掉;

4.5.2        字符串默認不使用引號表示。

str: 這是一行字符串

4.5.3        字符串之中包含空格或特殊字符,需要放在引號之中

如果字符串之中包含空格或特殊字符,需要放在引號之中。單引號和雙引號都可以使用

str: '內容: 字符串'

4.5.4        雙引號不會對特殊字符轉義。

s1: '內容\n字符串'

s2: "內容\n字符串"

4.5.5        單引號之中如果還有單引號,必須連續使用兩個單引號轉義。

str: 'labor''s day'

4.5.6        多行字符串可以使用|保留換行符,也可以使用>折疊換行。

this: |

  Foo

  Bar

that: >

  Foo

  Bar

轉為 JavaScript 代碼如下:

{ this: 'Foo\nBar\n', that: 'Foo Bar\n' }

4.5.7        +表示保留文字塊末尾的換行,-表示刪除字符串末尾的換行。

s1: |

  Foo

s2: |+

  Foo 

s3: |-

  Foo

轉為 JavaScript 代碼如下。

{ s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }

4.5.8        布爾值用truefalse表示。

NULL~表示。

4.5.9        錨點&和別名*,可以用來引用,定義數據的復用

第一步:使用 “&” 定義數據錨點(即要復制的數據)

第二步:使用 “*” 引用上述錨點數據(即數據的復制目的地)

2. defaults: &defaults

  1.    adapter:  postgres
  2.    host:     localhost 

6. development:

  1.    database: myapp_development
  2.    <<: *defaults
  3.   
  4. test:
  5.   database: myapp_test
  6.   <<: *defaults
  7.   

等同於下面的代碼。

2. defaults:

  1.    adapter:  postgres
  2.    host:     localhost
  3.   

6. development:

  1.    database: myapp_development
  2.    adapter:  postgres
  3.    host:     localhost
  4.  
  5. test:
  6.   database: myapp_test
  7.   adapter:  postgres
  8.   host:     localhost
  9.  

&用來建立錨點(defaults),<<表示合並到當前數據,*用來引用錨點。

下面是另一個例子。

 

2. - &showell Steve

3. - Clark

4. - Brian

5. - Oren

6. - *showell

 

轉為 JavaScript 代碼如下。

  1. [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM