处理 TOML
Groovy 有一个可选的 groovy-toml
模块,它提供对在 Groovy 对象和 TOML 之间转换的支持。专用于 TOML 序列化和解析的类位于 groovy.toml
包中。
1. TomlSlurper
TomlSlurper
是一个类,它将 TOML 文本或阅读器内容解析为 Groovy 数据结构(对象),例如映射、列表和原始类型,如 Integer
、Double
、Boolean
和 String
。
该类带有一堆重载的 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 |
|
number |
|
object |
|
array |
|
true |
|
false |
|
null |
|
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'
'''