在Groovy中读取YAML文件

在Groovy中读取YAML文件

本文介绍了在Groovy中读取YAML文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Groovy项目中加载现有的YAML文件(使用snakeYaml库).我有一个名为YamlTape.groovy的类,其中包含使用以下代码加载YAML文件的方法.

I am trying to load an existing YAML file (which uses snakeYaml library) in my Groovy project. I have a class called YamlTape.groovy which contains method to load the YAML file using the following code.

static YamlTape readFrom(Reader reader) {
    try {
        println "YamlTape : inside readFrom reader.size() = "+reader+" YamlTape: "+YamlTape

        yaml.loadAs(reader, YamlTape)
        println "YamlTape : after readfrom"
    } catch (YAMLException e) {
        println "YamlTape : inside catch block"
        throw new TapeLoadException('Invalid tape', e)
    }
}

并尝试从另一个常规类调用此方法.

and trying to call this method from another groovy class.

代码:

    YamlTape loadTape(String name) {
    println "YamlTapeLoader : inside loadTape"
    def file = fileFor(name)
    println "YamlTapeLoader : inside loadTape filename -name: "+name
    println "YamlTapeLoader : inside loadTape filename -file: "+file

    file.setReadable(true);
    file.setWritable(true);

    if (file.isFile()) {
        println "YamlTapeLoader : inside file.isFile() : "+file.isFile()
        def tape = file.withReader(FILE_CHARSET) { reader ->
            YamlTape.readFrom(reader)

            println "YamlTapeLoader : inside readFrom : "+reader
        }
        println "YamlTapeLoader : tape : "+tape


        tape
    } else {
        println "YamlTapeLoader : inside ELSE : "
        new YamlTape(name: name)
    }
}

但是load tape方法中的tape变量始终返回null.我添加了一些日志,发现代码能够访问yaml文件,但无法解析Yaml文档并作为Java Object返回.

But the tape variable in load tape method always returns null. I have added some logs and found the code is able to access the yaml file but unable to parse Yaml document and return as Java Object.

日志为:

YamlTapeLoader : inside loadTape
YamlTapeLoader : inside loadTape filename -name: kar
YamlTapeLoader : inside loadTape filename -file: /Users/Shared/AATest/Record/kar.yaml
YamlTapeLoader : inside file.isFile() : true
YamlTape : inside readFrom reader.size() = java.io.LineNumberReader@34189cab YamlTape: class co.freeside.betamax.tape.yaml.YamlTape
YamlTape : inside getYaml
YamlTape : representer = co.freeside.betamax.tape.yaml.TapeRepresenter@201a503f
YamlTape : constructor = org.yaml.snakeyaml.constructor.Constructor@16e7eec9
YamlTape : dumperOption = org.yaml.snakeyaml.DumperOptions@39d7af3
YamlTape : after readfrom
YamlTapeLoader : inside readFrom : java.io.LineNumberReader@34189cab
YamlTapeLoader : tape : null

推荐答案

withReader块隐式返回闭包的最后一行,在您的情况下为:

The withReader block implicitly returns the last line of the closure, which in your case is:

        println "YamlTapeLoader : inside readFrom : "+reader

println返回null,因此将代码更改为:

And println returns null, so change the code to:

    def tape = file.withReader(FILE_CHARSET) { reader ->
        def ret = YamlTape.readFrom(reader)
        println "YamlTapeLoader : inside readFrom : "+reader
        ret // Return the result of YamlTape.readFrom
    }

它应该可以工作

您的readFrom方法具有相同的错误...将其更改为:

Your readFrom method has the same error... Change it to:

static YamlTape readFrom(Reader reader) {
  try {
    println "YamlTape : inside readFrom reader.size() = "+reader+" YamlTape: "+YamlTape

    def ret = Yaml.loadAs(reader, YamlTape)
    println "YamlTape : after readfrom"

    ret // Return the YamlTape
  } catch (YAMLException e) {
    println "YamlTape : inside catch block"
    throw new TapeLoadException('Invalid tape', e)
  }
}

这篇关于在Groovy中读取YAML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 11:32