【问题标题】:Are there specifiers to merge keys in yaml?yaml 中是否有用于合并键的说明符?
【发布时间】:2016-12-25 01:20:26
【问题描述】:

即有没有办法改变这个例子:

myhash:
  - name: name1
    value: value1
myhash:
  - name: name2
    value: value2

进入:

myhash:
  - name: name1
    value: value1
  - name: name2
    value: value2

当我注意到默认情况下 YAML 将其转换为:

myhash:
  - name: name2
    value: value2

【问题讨论】:

  • 注意:不知道为什么@Anthon 没有提到这一点,但这也可以用锚点和别名来处理:另见stackoverflow.com/questions/9254178/…
  • 您链接到的两个问题都以有效的 YAML 开头,因此它们不适用于 OP 的主要问题。 AFAIK 没有多少插入锚和/或别名会使无效的 YAML 变为有效的 YAML,但我很高兴被证明是错误的(例如,如果有一个我没有使用过的非标准解析器将支持这一点)。如果您的意见是有效的,请在此处提供答案。如果你不能,你应该删除你的 cmets。
  • @Anthon 问候安东。为了清楚起见,这里或上面没有任何内容表明您的答案不正确。如果我们假设用户坚持使用“无效”的YAML,那么你的回答确实是正确和完整的,其他什么都不需要说明。然而,一些 SO 读者可能会错误地认为这里没有办法纠正主要问题,并假设 “没有 YAML 规范可以做我想做的事”。假设读者不坚持使用非唯一键,那么还有其他选择。这些其他替代方案值得明确包含,因此这些链接。谢谢。

标签: hash merge key yaml


【解决方案1】:

在 YAML 1.2 规范 it is stated 中,“映射 - 唯一键 到值的无序关联”(强调我的)。您的键不是唯一的,因此会发生什么取决于库实现(抛出错误,忽略其中一个键)。

您的解析器显然所做的是丢弃第一个键/值对。使用 YAML 解析器加载第一个示例无法完成您想要做的事情。您当然可以编写一个实用程序来拆分未使用 YAML 解析器的文本。

请注意,在 YAML 1.1 中:

两个相等的键出现在同一个映射节点是错误的。在这种情况下,YAML 处理器可能会继续,忽略第二个键:值对并发出适当的警告。

这是例如不是 YAML 1.1 解析器 PyYAML 的工作方式:它不会忽略第二个(或后面的)键的值,也不会发出警告。

【讨论】:

  • 好的,所以没有 YAML 规范可以做我想做的事。感谢您的回答!
猜你喜欢
  • 2012-07-26
  • 2011-10-08
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2013-07-22
相关资源
最近更新 更多