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

日期

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

当 YAML 中的值为 null 时,YamlSlurper 会将其补充为 Groovy 的 null 值。这与将 null 值表示为库提供的单例对象的其他 YAML 解析器不同。

1.1. 构建器

从 Groovy 创建 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"
'''