1. 程式人生 > >SpringBoot 2.X課程學習 | 第五篇:yml語法讓配置檔案更加簡潔易讀

SpringBoot 2.X課程學習 | 第五篇:yml語法讓配置檔案更加簡潔易讀

簡介

      YAML 是一種簡潔的非標記語言(YAML Ain’t Markup Language),YAML以資料為中心,使用空白,縮排,分行組織資料,從而使得表示更加簡潔易讀, 常用於作為配置檔案, 比json更加簡潔。

YAML 的設計目標

  • 人類容易閱讀
  • 可用於不同程式間的資料交換
  • 適合描述程式所使用的資料結構,特別是指令碼語言
  • 豐富的表達能力與可擴充套件性
  • 易於使用

YAML與XML、JSON比較

  • YAML 與 XML:具有 XML 同樣的優點,但比 XML 更加簡單、敏捷等
  • YAML 與 JSON:

            1、JSON 可以看作是 YAML 的子集,也就是說 JSON 能夠做的事情,YAML 也能夠做

            2、YAML 能表示得比 JSON 更加簡單和閱讀,例如“字串不需要引號”。所以 YAML 容易可以寫成 JSON 的格式,但並不建議這種做

            3、YAML 能夠描述比 JSON 更加複雜的結構,例如“關係錨點”可以表示資料引用(如重複資料的引用)

YAML的適用範圍

  •  由於實現簡單,解析成本很低,YAML特別適合在指令碼語言中使用。列一下現有的語言實現:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是指令碼語言.
  • YAML比較適合做序列化。因為它是宿主語言資料型別直轉的,由於相容性問題,不同語言間的資料流轉建議現在不要用YAML.
  • YAML做配置檔案也不錯。比如Ruby on Rails的配置就選用的YAML。對ROR而言,這很自然,也很省事.

語法

  • 大小寫敏感
  • 使用縮排表示層級關係
  • 禁止使用tab縮排,只能使用空格鍵 , 建議使用兩個空格
  • 縮排的空格數目不重要,只要相同層級的元素左側對齊即可
  • # 表示註釋,從這個字元一直到行尾,都會被解析器忽略。
  • 字串可以不用引號,也可以使用單引號或者雙引號

資料結構

  • 簡單屬性:字面量: 普遍的值(字串,數字,布林,字元等)

                        k: v:字面直接來寫

                        字串預設不需要加單引號或者雙引號,如果加雙引號,它不會轉義字串裡面的特殊字元,而加單引號,則會轉義字串裡面的特殊字元,意思就是將特殊字元直接變為字串輸出。

  • 複雜屬性:

          1、物件、map集合(鍵值對):冒號分隔鍵值對(Key: Value), Key需要頂格寫,前面不能有空格,冒號後面需要有一個空格然後再跟值, 相同的縮排屬於同一個map ,比如:

# 物件:縮排方式
obj: 
 field1: x
 field2: S

# 物件:行內方式
obj: {field1: x,field2: s}

           2、陣列(List、set):一組按次序排列的值,又稱為序列(sequence) / 列表(list)。比如:

# 陣列:連字元方式,如果元素也是陣列就再使用一層縮排
array:
 - ele1
 - ele2

# 陣列:行內方式
array: [elel,ele2]

      複雜屬性之間可以巢狀

  相關例項

---

# 使用冒號:表示鍵值對, 冒號後面需要有一個空格, key需要頂格寫,前面不能有空格 同一縮排的所有鍵值對屬於一個map

str: 這是一行字串   # 字串預設不使用引號表示
str2: '內容: 字串' # 如果字串之中包含空格或特殊字元,需要放在引號之中
str3: '內容\n字串'  # 單引號和雙引號都可以使用,雙引號不會對特殊字元轉義
str4: "內容\n字串"  # 雙引號對特殊字元不轉義
str5: 'labor''s day' # 單引號之中如果還有單引號,需要使用單引號轉義
# 字串可以寫成多行,從第二行開始,必須有一個單空格縮排。換行符會被轉為空格
str6: 這是一段  
  多行
  字串
str7: | # "|"表示每行末尾都跟一個換行符
  Foo
  Bar
str8: > # “>” 最後一行跟一個換行符
  Foo
  Bar
str9: |
  Foo
str10: |+ # +表示保留文字塊末尾的換行
  Foo

str11: |- # -表示刪除字串末尾的換行
  Foo

str12: | # 字串之中可以插入 HTML 標記
 <p style="color: red">
    段落
 </p>


int: 10
float: 9.99
bool: true  # true、false
# 時間採用 ISO8601 格式 1點被轉成9點
date: 2015-08-23   # 日期
datetime: 2015-08-23T02:02:00.1z  # 日期時間
iso8601: 2015-08-23t21:59:43.10-05:00  # iso8601 日期格式
spaced: 2015-08-23 21:59:43.10 -5      #


# 物件:縮排方式
obj: 
 field1: x
 field2:
   field21: xx
   field22: xxx

# 物件:行內方式(和json格式差不多)
obj2: { field1: 'x', field2: { field21: 'xx', field22: 'xxx' } }


# 陣列:連字元方式,如果元素也是陣列就再使用一層縮排
array:
 - ele1
 - ele2
 -
   - ele31
   - ele32

# 行內方式
array2: [ 'ele1', 'ele2', [ 'ele31', 'ele32' ] ]

# 陣列中的原始是物件
array3:
  - field1: x
    field2: xx
    field3: xxx
  - field1: x
    field2: xx
    field3: xxx

set: 
  ? ele
  ? ele2

# 巢狀方式
nested:
  field1: x
  arr:
   - {field1: x, field2: x, field3: [1, 2, 3]}
   - {field1: x, field2: x, field3: [2, 3, 4]}
  arr2:
   -
    - a
    - b
   - 
    - c
    - c

# 型別轉換: 使用兩個感嘆號跟要轉換的基本資料型別,單引號:用於轉換自定義物件
#下面是內建型別
#!!int               # 整數型別
#!!float             # 浮點型別
#!!bool              # 布林型別
#!!str               # 字串型別
#!!binary            # 也是字串型別
#!!timestamp         # 日期時間型別
#!!null              # 空值
#!!set               # 集合
#!!omap, !!pairs     # 鍵值列表或物件列表
#!!seq               # 序列,也是列表
#!!map               # 鍵值表
test: !!str 123

# 當鍵是陣列或者物件時需要使用問號來標記
?[blue, reg, green]: xxx
?{a:xx, b:xx}: xx

# 錨點和引用
ref:
 - &index1 a
 - b
 - *index1
... 

       如果使用yml檔案格式作為配置檔案的話,那麼還有一個好處,yml檔案支援多文件塊的方式,使用“---”即可,可將編輯的內容分為多個文件,“...”可作為檔案