【问题标题】:Yaml merge ignoring properties defined in anchorYaml合并忽略锚中定义的属性
【发布时间】:2019-08-24 13:50:41
【问题描述】:

考虑一下这个 yaml

- node_1:
    properties: &node_1_prop
      role: management
      layer: 1

- node_2:
    properties:
      level:  24
      <<: *node_1_prop

我正在尝试使用 snakeyaml 库创建节点图,我希望 node_1 有两个属性,node_2 有三个属性,例如 this

Path yamlPath = Paths.get( "nodes.yaml");
InputStream yamlStream = Files.newInputStream(yamlPath);
StreamReader sreader = new StreamReader(new UnicodeReader(yamlStream));
Composer composer = new Composer(new ParserImpl(sreader), new Resolver());
Node rootNode = composer.getSingleNode();

snakeyaml 的输出节点图将&lt;&lt; 显示为node_2 的属性。

Git 上显示结果的代码示例。

编辑:

如果我将 yaml 定义如下:

- node_1:
    properties: &node_1_prop
      role: management
      layer: 1

- node_2:
      <<: *node_1_prop

但是我的要求不仅仅是复制属性,而是拥有其他属性。

【问题讨论】:

  • @Anthon 我也尝试过,但结果相同。您可以从 Git 下载代码并根据需要尝试一些操作。我的猜测是,这是库中的错误。

标签: java merge yaml snakeyaml


【解决方案1】:

您不会完全加载您的 YAML,您只需 编写它(参见 SnakeYaml 实现的 graph in the YAML 1.1 spec)。

撰写步骤解析别名,但保留标签——标签在构造过程中被解析。合并键定义为 as a tag,因此在您编写 YAML 输入时不会得到处理。

【讨论】:

  • 如何构建节点?我错过了任何步骤吗?我更新了我的答案,以提供另一个示例,在该示例中创建适当的节点并删除标签。
  • 嗯,我不知道实际的实现,我只是根据规范假设的情况来回答。我真的不能告诉你为什么另一个例子是有效的。无论如何,构造是通过(new Yaml()).load(input) 完成的,你会从中获得标准的Java 类型(ListMapString,具体取决于根节点)。这在the docs 中有详细介绍。
  • 另外请注意,合并键超出了标签的原始 YAML 定义。它们应该映射到本机类型,但是,!!merge(或关联的键)映射到 YAML 中并不真正存在的处理指令。由于没有关于实施的建议,您可能会遇到奇怪的行为,我建议您不要使用它。
  • 如果你添加到你的 git 代码 List prop3 = node_2_props.getValue().stream() .map(prop -> ((ScalarNode) prop.getKeyNode()).getTag() .getValue()) .collect(Collectors.toList()); System.out.println("Node_3 属性:" + prop3);您将看到该节点的标签已合并。构造函数处理合并,但@flyx 正确地说:你只组成节点。
猜你喜欢
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
相关资源
最近更新 更多