覆盖YAML子项

Nat*_*ate 14 yaml

说我有以下YAML文件:

-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: value
-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: SOME DIFFERENT VALUE
Run Code Online (Sandbox Code Playgroud)

处理大量相同数据的自然方式是使用锚点,并覆盖更改的键.

问题是,这里的子项不同.有没有一种简单的方法来引用key100['subkey100']改变了?或者我必须在每个级别使用一系列锚点?

即,是否有简写:

- &anchor
   key1: value
# and so on...
   key99: value
   key100: &subanchor
      subkey1: value
# and so on...
      subkey100: value
-
   <<: *anchor
   key100:
      <<: *subanchor
      subkey100: SOME DIFFERENT VALUE
Run Code Online (Sandbox Code Playgroud)

Jas*_*ark 10

如果我正确理解了这个问题,我认为规范不支持覆盖锚定节点的元素.

在阅读规范(版本1.2,但1.1表示相同)时,第7.1别名节点声明(强调我的):

先前序列化节点的后续出现被表示为别名节点.必须通过锚标记节点的第一次出现,以允许后续出现作为别名节点.

别名节点由"*"指示符表示.别名是指具有相同锚点的最近的前一节点.别名节点使用先前未在文档中出现的锚点是错误的.指定任何别名节点未使用的锚点并不是错误.

请注意,别名节点不得指定任何属性或内容,因为这些属性或内容在第一次出现时已指定.

这里有两点:

  1. "以前序列化的节点" - 此措辞表明别名旨在表示原始节点的另一个出现,而不仅仅是原始节点中的数据.换句话说,它代表相同的对象,而不是副本.

  2. 如果别名不能包含任何内容(第二个粗体部分),则无法以问题中建议的方式指定覆盖.

所以我对规范的解释是你根据规范不能这样做.

但是 - 如果将示例(第二个代码块)从原始文件粘贴到此在线工具(您可能希望取消选中"规范"),该工具会按照问题中的预期解释它,复制原始内容但覆盖子密钥100.与此在线解析器一样,此YAML Lint工具也是如此.

所以它似乎在实践中起作用,但我在规范中找不到对它的支持.

  • 我认为 `&lt;&lt;` 运算符正在制作一个深拷贝,然后可以就地修改 (2认同)