与 JSON 不同,YAML 允许对象的键是任何内容,例如数组或对象。 (参考)
是否可以为 YAML 编写一个模式来定义键应该是什么样子?例如
mapping:
# accepted: each key must be an array of ints
? - 2
- 3
: okay
# not accepted
? - hello
- world
: not okay
或
mapping:
# accepted: each key must be an object
# with a field called "value", whose value is a string
? value: hello world
: okay
# not accepted
? hello: world
: not okay
我熟悉编写 JSON 模式,只要目标 yaml 不使用任何此类“高级”功能,它也适用于 YAML。但我不知道这样的事情是否可能超出 JSON 范围。
是否可以为 YAML 编写一个模式来定义键应该是什么样子?
技术上是的,但并非每次实施都如此。
您可以根据 YAML 规范对 schema 的定义进行争论,静态类型语言中的实现(例如 Java 的 SnakeYAML、Go 的 go-yaml、Nim 的 NimYAML 等)使用它们反序列化为的本机类型作为架构。因此,如果您反序列化为,例如
Map<ComplexKey, Value>
,这将是一个通过类型 ComplexKey
定义键结构的模式。
但是,您的用例可能是不同的。例如,schema 的常见定义是“我可以使用命令行工具或编辑器插件验证 YAML 文件的结构定义”。如果这是您的用例,那么我在上一段中描述的内容对您来说毫无用处 - 因为您需要为要验证的每个模式编译一个基于该工具的工具。