Правило, определяющее последовательность полей в YAML - PullRequest
0 голосов
/ 26 мая 2020

Проверка действительности YAML с помощью https://onlineyamltools.com/convert-yaml-to-json

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:
    ^

1 Ответ

1 голос
/ 26 мая 2020

Вопреки вашему комментарию, 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 spe c.

...