天天看點

SpringCloud入門之YAML格式檔案規範學習

1. 認識 YAML

  YAML(發音 /ˈjæməl/)是一個類似 XML、JSON 的資料序列化語言。其強調以資料為中心,旨在友善人類使用;并且适用于日常常見任務的現代程式設計語言。因而 YAML 本身的定義比較簡單,号稱“一種人性化的資料格式語言”。

1.1 YAML 的設計目标:
  • 人類容易閱讀
  • 可用于不同程式間的資料交換
  • 适合描述程式所使用的資料結構,特别是腳本語言
  • 豐富的表達能力與可擴充性
  • 易于使用
1.2 YAML 與 XML、JSON
  • YAML 與 XML
    • 具有 XML 同樣的優點,但比 XML 更加簡單、靈活等
  • YAML 與 JSON
    • JSON 可以看作是 YAML 的子集,也就是說 JSON 能夠做的事情,YAML 也能夠做
    • YAML 能表示得比 JSON 更加簡單和閱讀,例如“字元串不需要引号”。是以 YAML 容易可以寫成 JSON 的格式,但并不建議這種做
    • YAML 能夠描述比 JSON 更加複雜的結構,例如“關系錨點”可以表示資料引用(如重複資料的引用)。
1.3 YAML 組織結構

  YAML 檔案可以由一或多個文檔組成(也即相對獨立的組織結構組成),文檔間使用“---”(三個橫線)在每文檔開始作為分隔符。同時,文檔也可以使用“...”(三個點号)作為結束符(可選)。如下圖所示:

SpringCloud入門之YAML格式檔案規範學習
  • 如果隻是單個文檔,分隔符“---”可省略。
  • 每個文檔并不需要使用結束符“...”來表示結束,但是對于網絡傳輸或者流來說,作為明确結束的符号,有利于軟體處理。(例如不需要知道流關閉就能知道文檔結束) <br/>

  YAML 認為資料由以下三種結構組成:(每個文檔由三種結構混合組成)

  • 标量 (相當于資料類型)
  • 序列 (相當于數組和清單)
  • 鍵值表(相當于 Map 表)

2. 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