SpringBoot 優雅的讀取yml(yml規範篇)

一 認識 YAML

YAML(發音 /ˈjæməl/)是一個類似 XML、JSON 的數據序列化語言。其強調以數據爲中心,旨在方便人類使用;並且適用於日常常見任務的現代編程語言。因而 YAML 本身的定義比較簡單,號稱“一種人性化的數據格式語言”。

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 文件可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作爲分隔符。同時,文檔也可以使用“…”(三個點號)作爲結束符(可選)。如下圖所示:

1.如果只是單個文檔,分隔符“---”可省略。
2.每個文檔並不需要使用結束符“…”來表示結束,但是對於網絡傳輸或者流來說,作爲明確結束的符號,有利於軟件處理。(例如不需要知道流關閉就能知道文檔結束)
3.YAML 認爲數據由以下三種結構組成:(每個文檔由三種結構混合組成)

標量 (相當於數據類型)
序列 (相當於數組和列表)
鍵值表(相當於 Map 表)

二 YAML 編寫規範

它的基本語法規則如下:
1)大小寫敏感
2)使用縮進表示層級關係
3)縮進時不允許使用Tab鍵,只允許使用空格。
4)縮進的空格數目不重要,只要相同層級的元素左側對齊即可

規範一:文檔使用 Unicode 編碼作爲字符標準編碼,例如 UTF-8

規範二:使用“#”來表示註釋內容

# 客戶訂單
date: 2015-02-01
customer:
  - name: Jai
items:
  - no: 1234         # 訂單號
  - descript: cpu

規範三:使用空格作爲嵌套縮進工具。通常建議使用兩個空格縮進,不建議使用 tab (甚至不支持)

規範四:序列表示

使用“-”(橫線) + 單個空格表示單個列表項

--- # 文檔開始
- 第一章 簡介
- 第二章 設計目錄

使用"[]"表示一組數據

--- # 文檔開始
[blue, red, green]

組合表示。每個結構都可以嵌套組成複雜的表示結構。

--- # 文檔開始
- [blue, red, green]     # 列表項本身也是一個列表
- [Age, Bag]
- site: {osc:www.oschina.net, baidu: www.baidu.com}  # 這裏是同 鍵值表 組合表示

規範五:鍵值表

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

# 客戶訂單
date: 2015-02-01
customer:
  - name: Jai
items:
  - no: 1234         # 訂單號
  - descript: cpu
  - price: ¥800.00

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

# 客戶訂單
date: 2015-02-01
customer:
  - name: Jai
items: {no: 1234, descript: cpu, price: ¥800.00}

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

 # 使用一個列表作爲鍵
 ? [blue, reg, green]: Color
 # 等價於
 ? - blue
   - reg
   - gree
 : Color

組合表示。每個結構都可以嵌套組成複雜的表示結構。

Color:
    - blue
    - red
    - green

 # 相當於 (也是 JSON 的表示)
 {Color: [blue, red, green]}

 div:
    - border: {color: red, width: 2px}
    - background: {color: green}
    - padding: [0, 10px, 0, 10px]

 # 使用縮進表示的鍵值表與列表項
 items:
    - item: cpu
      model: i3
      price: ¥800.00
    - item: HD
      model: WD
      price: ¥450.00

 # 上面使用 “-” 前導與縮進來表示多個列表項,相當於下面的JSON表示
 items: [{item:cpu, model:i3, price:¥800.00}, {item:HD, model:WD, price: ¥450.00}]

規範六:文本塊

使用 “|” 和文本內容縮進表示的塊:保留塊中已有的回車換行。相當於段落塊

yaml: | # 注意 ":" 與 "|" 之間的空格
JSON的語法其實是YAML的子集,大部分的JSON文件都可以被YAML的解釋器解釋。

使用 “>” 和文本內容縮進表示的塊:將塊中回車替換爲空格,最終連接成一行。

yaml: > # 注意 ":" 與 ">" 之間的空格,另外可以使用空行來分段落
JSON的語法其實是YAML的子集,
大部分的JSON文件都可以被YAML的解釋器解釋。

使用定界符“”(雙引號)、‘’(單引號)或回車表示的塊:最終表示成一行。

yaml: # 使用回車的多行,最終連接成一行。
JSON的語法其實是YAML的子集,
大部分的JSON文件都可以被YAML的解釋器解釋。

yaml: # 使用了雙引號,雙引號的好處是可以轉義,即在裏面可以使用特殊符號
"JSON的語法其實是YAML的子集,
大部分的JSON文件都可以被YAML的解釋器解釋。"

規範七:數據類型的約定

對一些常用數據類型的表示格式進行了約定,包括:

 integer: 12345     # 整數標準形式
 octal: 0o34        # 八進制表示,第二個是字母 o
 hex: 0xFF          # 十六進制表示

 float: 1.23e+3     # 浮點數
 fixed: 13.67       # 固定小數
 minmin: -.inf      # 表示負無窮
 notNumber: .NaN    # 無效數字

 null:              # 空值
 boolean: [true, false] # 布爾值
 string: '12345'    # 字符串

 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      # ?

“!”(歎號)顯式指示類型,或自定義類型標識。單歎號通常是自定義類型,雙歎號是內置類型

isString: !!str 2015-08-23     # 強調是字符串不是日期數據
 picture: !!binary |            # Base64  圖片
     R0lGODlhDAAMAIQAAP//9/X
     17unp5WZmZgAAAOfn515eXv
     Pz7Y6OjuDg4J+fn5OTk6enp
     56enmleECcgggoBADs=
 #下面是內置類型
 !!int               # 整數類型
 !!float             # 浮點類型
 !!bool              # 布爾類型
 !!str               # 字符串類型
 !!binary            # 也是字符串類型
 !!timestamp         # 日期時間類型
 !!null              # 空值
 !!set               # 集合
 !!omap, !!pairs     # 鍵值列表或對象列表
 !!seq               # 序列,也是列表
 !!map               # 鍵值表
 #下面是一些例子:
 --- !!omap
 - Mark: 65
 - Sammy: 63
 - Key: 58

 --- !!set           # 注意,“?”表示鍵爲列表,在這裏列表爲 null
 ? Mark
 ? Sammy
 ? Key

 # 下面是自定義的類型或標識
 %TAG ! tag:clarkevans.com,2002:   # % 是指令符號
 --- !shape
 # Use the ! handle for presenting
 # tag:clarkevans.com,2002:circle
 - !circle
   center: &ORIGIN {x: 73, y: 129}
   radius: 7
 - !line
   start: *ORIGIN
   finish: { x: 89, y: 102 }
 - !label
   start: *ORIGIN
   color: 0xFFEEBB
   text: Pretty vector drawing.

規範八:錨點與引用,定義數據的複用。

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

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

---
 hr:
   - Mark McGwire
   # Following node labeled SS
   - &SS Sammy Sosa            # 定義要複製的數據
 rbi:
   - *SS # Subsequent occurrence   這裏是數據複製目標
   - Ken Griffey

詳盡語法見官網:http://www.yaml.org/spec/1.2/spec.html

轉自:https://www.cnblogs.com/BlogNetSpace/p/8444861.html

發佈了240 篇原創文章 · 獲贊 370 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章