当前位置: 首页 > 面试题库 >

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

陈铭晨
2023-03-14
问题内容

我正在尝试使用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代码,以便它将浮点数保留为字符串):

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,只有然后包含objectwith键1st example

对于您的情况,请尝试此访问权限:

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]


 类似资料:
  • 问题内容: 我正在尝试使用Groovy和Snakeyaml解析以下YAML文件(显然,我已经清除了数据,但足以证明问题所在): 我期望以下语句: 产生: 和: 产生: 但是, 实际 输出来自: 是: 我只能通过包含列表索引来获得所需的输出: 似乎没有必要。也许我误解了数据的结构? 为了完整起见,下面显示了我用来说明问题的常规代码(我从网上获取了CustomerResolver代码,以便它将浮点数保

  • 我的代码看起来像 我的文件如下所示 当我运行程序时,我看到 我怎样才能修好它呢?

  • 我在用 使用G1垃圾收集器。JVM参数是 然而,我在没有任何明显原因的情况下经历了完整的GC扫描,如何摆脱它们? GC日志,带有前面事件的一些尾部: 其他类似的: 其他类似问题报告: http://grokbase.com/t/openjdk/hotspot-gc-use/1192sy84j5/g1c-strange-full-gc-behaviorhttp://grokbase.com/p/op

  • 问题内容: 我用来填充包含HTML无序列表()的模板。 这些中的大多数没有那么长,但是有一些长度却很可笑,实际上可以容纳2-3列。 有没有HTML,ColdFusion或JavaScript(我接受jQuery解决方案)的方法可以轻松地做到这一点?为了节省一些滚动,不值得使用过于复杂的重量级解决方案。 问题答案: 所以我从A List Apart CSS Swag:Multi-ColumnList

  • 我对python还很陌生,我正在尝试创建21点。然而,当我试图打印出玩家的手牌时,我遇到了一些困难。 这是我的击球(抽牌)代码: 这是我打印卡片的代码: 我的代码所做的第一件事是为庄家和玩家抽两张牌,这运行得很好。然而,当玩家抽到一张牌后,它就会变得有点摇摆不定。输出如下所示: 当我抽到一张新牌时,这张牌不变,它保持我抽到的最后一张牌。然后,当我打印我的甲板,它打印我的旧甲板和我的新甲板。但是,分

  • 问题内容: 我正在尝试合并多个CSV文件。我的初始功能旨在: 在目录中查找并计算其中的文件数(假设所有文件均为.csv) 打开第一个CSV并将每一行添加到列表中 剪辑前三行(我不想要一些无用的列标题信息) 将这些结果存储在一个我称为“存档”的列表中 打开下一个CSV文件并重复(剪切并将它们附加到“存档”中) 当我们没有CSV文件时,我想将完整的“存档”写入单独文件夹中的文件。 因此,例如,如果我要