首页 > 解决方案 > 控制 YAML 中字段顺序的规则

问题描述

使用https://onlineyamltools.com/convert-yaml-to-json检查 YAML 的有效性

下面的 YAML 是正确的

# Valid yaml (field "name" placed at LAST position)
match:
- uri:
    prefix: "/mysvc1/"
route:
- destination:
    host: myservice1
    port:
        number: 80
name: "svc1-routes"

但是,如果我将该字段移动name到第一个位置,YAML 将变为无效。是什么原因?

# Invalid yaml (field "name" placed at FIRST position)
match:
name: "svc1-routes" # <---- ERROR ----
- uri:
    prefix: "/mysvc1/"
route:
- destination:
    host: myservice1
    port:
        number: 80

错误信息:

Error: YAMLException: end of the stream or a document separator is expected at line 4, column 1:
    - uri:
    ^

标签: yaml

解决方案


与您的评论相反,name并且match处于同一级别,因为它们共享相同的缩进。name绝不嵌套在match(也不是route)中。

然而,列表项嵌套的,match因为 YAML 将 理解-为缩进的一部分,因此列表项被认为比缩进更多match,因此嵌套在其中。

关于你的错误:

name: "svc1-routes"
- uri:

在这部分中,映射键name被分配了标量值svc1-routes。每个映射键可能只有一个值。在下一行,一个序列开始于更深的缩进级别(如上所述),但 YAML 不能将它放在任何地方,因为键name已经有一个值。这就是它发出错误的原因。

您可以自由切换映射键及其嵌套值,例如:

route:
- destination:
    host: myservice1
    port:
        number: 80
name: "svc1-routes"
match:
- uri:
    prefix: "/mysvc1/"

这将加载到与 YAML 规范相同的结构。


推荐阅读