处理 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 是一种功能强大的表达式语言,它受到多种解析器的支持,这些解析器适用于不同的数据格式(例如,用于 XML 的 XmlSlurper)。

有关更多详细信息,请查看关于 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 值对其进行补充。这与其他将 null 值表示为库提供的单例对象的 TOML 解析器形成对比。

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