扩展YAML参考标记(锚点和别名)

时间:2017-03-01 22:39:51

标签: syntax yaml alias cross-reference

在Yaml中,我们可以引用另一个yaml节点,如:

Person: &PersonID
  FirstName: Xyz
  LastName: Abc

Type:
  - *PersonID

但如果我想将其扩展到:

Type:
  - *PersonID
     Foo: foo
Type1:
  - *PersonID
     Bar: bar

我不能这样做。我在下面有一个解决方案,但想知道它有什么特定的原因吗?

Type:
  - ReferenceType: *PersonID
    Age: 20

我知道&和*是YAML别名交叉引用,但是有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

嗯,某些实现支持merge密钥:

Person: &PersonID
  FirstName: Xyz
  LastName: Abc

Type:
  << : *PersonID
  Foo: foo
Type1:
  << : *PersonID
  Bar: bar

但是,请注意,这不是核心YAML的一部分,并且尚未针对YAML 1.2进行更新,因此您的实施可能支持也可能不支持。

YAML社区对此的主要意见是<<从一开始就是一个坏主意,不应该指明,原因有两个:

  • 它没有指定它与非核心标签的交互(如果应该合并某些内容的映射有一些不允许<<作为子节点的特定标签会怎样?它是否有效?它是无效的吗?)
  • 即使YAML是数据描述语言,它也实现了操作。这根本不适合YAML,也给人们一种错误的印象,即YAML一般支持这样的操作(但你不能对序列等做同样的事情)。

这似乎符合您的要求,但如果您使用它,请注意它的缺点。