gpt4 book ai didi

java - Snakeyaml 似乎不必要地将简单值包装在列表中

转载 作者:行者123 更新时间:2023-11-30 06:38:01 25 4
gpt4 key购买 nike

我正在尝试使用 Groovy 和 Snakeyaml 解析以下 YAML 文件(显然我已经清理了数据,但这足以证明问题):

---
info:
summary: Snakeyaml Issue
examples:
- 1st example:
name: Example 1
sublist:
- 0.1:
foo: bar

我希望得到以下声明:

println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"

产量:

Snakeyaml Issue
Example 1
[foo:bar]

和:

println resource.examples."1st example".sublist."0.1".foo

产量:

bar

但是,实际输出来自:

println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"
println resource.examples."1st example".sublist."0.1".foo

是:

Snakeyaml Issue
[Example 1]
[[[foo:bar]]]
[[bar]]

我只能通过包含列表索引来获得所需的输出:

println resource.info.summary
println resource.examples[0]."1st example".name
println resource.examples[0]."1st example".sublist[0]."0.1"
println resource.examples[0]."1st example".sublist[0]."0.1".foo

这似乎没有必要。也许我误解了数据的结构?

为了完整起见,我用来说明问题的常规代码如下所示(我从网上获取了 CustomerResolver 代码,以便它将 float 保留为字符串):

import org.yaml.snakeyaml.DumperOptions
import org.yaml.snakeyaml.Yaml
import org.yaml.snakeyaml.constructor.Constructor
import org.yaml.snakeyaml.nodes.Tag
import org.yaml.snakeyaml.representer.Representer
import org.yaml.snakeyaml.resolver.Resolver

def fileName = "example.yaml"
def Yaml yaml = new Yaml(new Constructor(), new Representer(), new DumperOptions(),
new CustomResolver())
def resource = yaml.load(new File(fileName).newInputStream())

println resource.info.summary
println resource.examples."1st example".name
println resource.examples."1st example".sublist."0.1"
println resource.examples."1st example".sublist."0.1".foo

class CustomResolver extends Resolver {

/*
* Do not resolve float and timestamp
*/

protected void addImplicitResolvers() {
addImplicitResolver(Tag.BOOL, BOOL, "yYnNtTfFoO");
addImplicitResolver(Tag.INT, INT, "-+0123456789");
addImplicitResolver(Tag.MERGE, MERGE, "<");
addImplicitResolver(Tag.NULL, NULL, "~nN\0");
addImplicitResolver(Tag.NULL, EMPTY, null);

}
}

有什么想法吗?

最佳答案

访问 yaml 的方式存在问题

examples 首先包含 list,然后才包含带有键 第一个示例object

根据您的情况尝试此访问:

println resource.info.summary
println resource.examples[0]."1st example"
println resource.examples[0]."1st example".name
println resource.examples[0]."1st example".sublist[0]
println resource.examples[0]."1st example".sublist[0]."0.1"
println resource.examples[0]."1st example".sublist[0]."0.1".foo

要了解列表访问器的工作原理,请查看此示例:

@Grab(group='org.yaml', module='snakeyaml', version='1.18')
import org.yaml.snakeyaml.Yaml

def Yaml yaml = new Yaml()
def resource = yaml.load(new StringReader('''---
info:
summary: Snakeyaml Issue
examples:
- 1st example:
name: Example 1
- 1st example:
name: Example 2
- 1st example:
xname: Example 3
- 2nd example:
name: Example 4
'''))

println resource.examples."1st example"
//prints> [[name:Example 1], [name:Example 2], [xname:Example 3], null]

println resource.examples."1st example".name
//prints> [Example 1, Example 2, null]

关于java - Snakeyaml 似乎不必要地将简单值包装在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44881499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com