处理 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 是一种强大的表达式语言,受到多种 slurpers(针对不同数据格式)的支持(例如,XmlSlurper 用于 XML)。

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

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

YAML 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

只要 YAML 中的值为 nullYamlSlurper 就会用 Groovy 的 null 值对其进行补充。这与其他 YAML 解析器形成对比,其他解析器用库提供的单例对象表示 null 值。

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