處理 TOML

Groovy 有個可選擇的 groovy-toml 模組,可支援在 Groovy 物件和 TOML 之間轉換。專門用於 TOML 序列化和剖析的類別在 groovy.toml 套件中。

1. TomlSlurper

TomlSlurper 是個將 TOML 文字或讀取器內容剖析成 Groovy 資料結構(物件)的類別,例如地圖、清單和原生的型別,如 IntegerDoubleBooleanString

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

        def ts = new TomlSlurper()
        def toml = ts.parseText '''
language = "groovy"
sudo = "required"
dist = "trusty"
before_script = [ "unset _JAVA_OPTIONS\\n\\n    \\n" ]

[[matrix.include]]
jdk = "openjdk10"

[[matrix.include]]
jdk = "oraclejdk9"

[[matrix.include]]
jdk = "oraclejdk8"
'''

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

請注意,結果是一個純粹的地圖,可以像處理一般的 Groovy 物件實例一樣處理。TomlSlurper 會根據 Tom’s Obvious, Minimal Language 定義的 TOML 來剖析給定的 TOML。

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

有關更多詳細資料,請查看 GPath 表達式 部分。

下表提供了 TOML 類型和對應 Groovy 資料類型的概觀

TOML 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 日期格式

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

1.1. 建構器

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

        def builder = new TomlBuilder()
        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'
records.car.make = 'Holden'
records.car.year = 2006
records.car.country = 'Australia'
records.car.homepage = 'http://example.org'
records.car.record.type = 'speed'
records.car.record.description = 'production pickup truck with speed of 271kph'
'''