yaml - 控制 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:
^
解决方案
与您的评论相反,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 规范相同的结构。
推荐阅读
- linux - 如何使用 GCC/LD 设置 RPATH 和 RUNPATH?
- php - Groovy Base64 解码与 PHP base64_decode
- ios - 从 alamofire 上传多个文件时如何获取文件上传完成计数?
- javascript - 创建集合结构的嵌套数组
- asp.net - 实体框架覆盖服务层上的 SaveChanges() 而不是数据层(不同的项目)
- compiler-errors - 错误:未定义环境变量“STAGING_DIR”
- python - 对 .join() 感到困惑
- processing - 如何按数字排序字符串数组
- c# - 推出更新或让用户升级到付费版本 VS SQLite 数据保存 C# UWP
- ruby-on-rails - 在 Rails 控制台中访问 current_user