处理 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。

由于 TomlSlurper 返回的是纯 Groovy 对象实例,背后没有任何特殊的 TOML 类,因此其用法是透明的。事实上,TomlSlurper 的结果符合 GPath 表达式。GPath 是一种强大的表达式语言,受多个不同数据格式的 slurper 支持(XmlSlurper 用于 XML 就是一个例子)。

有关更多详细信息,请参阅有关 GPath 表达式的部分。

下表概述了 TOML 类型和相应的 Groovy 数据类型

TOML Groovy

string

java.lang.String

number

java.lang.BigDecimaljava.lang.Integer

object

java.util.LinkedHashMap

array

java.util.ArrayList

true

true

false

false

null

null

date

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

每当 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'
'''