處理 YAML

Groovy 有個可選的 groovy-yaml 模組,提供在 Groovy 物件和 YAML 之間轉換的功能。專門用於 YAML 序列化和剖析的類別可以在 groovy.yaml 套件中找到。

1. YamlSlurper

YamlSlurper 是一個類別,可以將 YAML 文字或讀取器內容剖析成 Groovy 資料結構(物件),例如地圖、清單和 IntegerDoubleBooleanString 等基本類型。

這個類別附帶許多超載的 parse 方法,以及一些特殊方法,例如 parseText 等。在以下範例中,我們將使用 parseText 方法。它會剖析一個 YAML String,並遞迴地將它轉換成物件的清單或地圖。其他 parse* 方法類似,它們會傳回一個 YAML String,但參數類型不同。

        def ys = new YamlSlurper()
        def yaml = ys.parseText '''
language: groovy
sudo: required
dist: trusty

matrix:
  include:
    - jdk: openjdk10
    - jdk: oraclejdk9
    - jdk: oraclejdk8

before_script:
  - |
    unset _JAVA_OPTIONS

        '''

        assert 'groovy' == yaml.language
        assert 'required' == yaml.sudo
        assert 'trusty' == yaml.dist
        assert ['openjdk10', 'oraclejdk9', 'oraclejdk8'] ==  yaml.matrix.include.jdk
        assert ['unset _JAVA_OPTIONS'] == yaml.before_script*.trim()

請注意,結果是一個純粹的地圖,可以像一般的 Groovy 物件實例那樣處理。YamlSlurper 會根據 YAML Ain’t Markup Language (YAML™) 定義的規則剖析指定的 YAML。

由於 YamlSlurper 會傳回純粹的 Groovy 物件實例,而不會在後端使用任何特殊的 YAML 類別,因此它的用法很透明。事實上,YamlSlurper 的結果符合 GPath 表達式。GPath 是一種強大的表達式語言,由多個針對不同資料格式的 slurper 支援(例如,XmlSlurper 就是針對 XML 的一個範例)。

如需更多詳細資訊,請參閱 GPath 表達式 部分。

下表概述了 YAML 類型和對應的 Groovy 資料類型

YAML Groovy

字串

java.lang.String

數字

java.lang.BigDecimaljava.lang.Integer

物件

java.util.LinkedHashMap

陣列

java.util.ArrayList

true

true

false

false

null

null

日期

java.util.Date 基於 yyyy-MM-dd’T’HH:mm:ssZ 日期格式

當 YAML 中的值為 null 時,YamlSlurper 會補充 Groovy null 值。這與其他 YAML 解析器不同,後者會以程式庫提供的單例物件表示 null 值。

1.1. 建構器

建立 YAML 的另一種方法是使用 YamlBuilder。建構器提供一個 DSL,允許制定一個物件圖,然後轉換為 YAML。

        def builder = new YamlBuilder()
        builder.records {
            car {
                name 'HSV Maloo'
                make 'Holden'
                year 2006
                country 'Australia'
                homepage new URL('http://example.org')
                record {
                    type 'speed'
                    description 'production pickup truck with speed of 271kph'
                }
            }
        }

        assert builder.toString() == '''---
records:
  car:
    name: "HSV Maloo"
    make: "Holden"
    year: 2006
    country: "Australia"
    homepage: "http://example.org"
    record:
      type: "speed"
      description: "production pickup truck with speed of 271kph"
'''