如何用JSON Schema验证YAML中引用值是否属于预定义键集合?
可以实现,具体方案如下
这个需求完全可以通过JSON Schema实现,核心是利用动态引用文档内字段的能力(仅支持Draft 2020-12及以上版本),或者在低版本中手动枚举合法值。
示例目标YAML
先明确我们要验证的YAML结构(符合你描述的格式):
myDef: foo: "任意字符串值" baz: "任意字符串值" someProperty: referencedValue: "foo" # 仅允许填foo或baz
Draft 2020-12 版本的动态约束Schema
这个版本支持$data关键字,可以动态读取myDef的键名作为referencedValue的合法取值,无需手动维护枚举列表:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "myDef": { "type": "object", "properties": { "foo": { "type": "string" }, "baz": { "type": "string" } }, "required": ["foo", "baz"], "additionalProperties": false # 禁止给myDef添加未预定义的键 }, "someProperty": { "type": "object", "properties": { "referencedValue": { "type": "string", "enum": { "$data": "/myDef/properties" } # 动态引用myDef的所有属性名,作为referencedValue的合法选项 } }, "required": ["referencedValue"] } }, "required": ["myDef", "someProperty"] }
低版本(如Draft 7)的静态约束Schema
如果你的验证工具不支持Draft 2020-12,只能手动枚举合法值,缺点是后续myDef的键变更时需要同步修改枚举列表:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "myDef": { "type": "object", "properties": { "foo": { "type": "string" }, "baz": { "type": "string" } }, "required": ["foo", "baz"], "additionalProperties": false }, "someProperty": { "type": "object", "properties": { "referencedValue": { "type": "string", "enum": ["foo", "baz"] } }, "required": ["referencedValue"] } }, "required": ["myDef", "someProperty"] }
关键说明
additionalProperties: false的作用是限制myDef只能包含你预定义的foo和baz,避免出现未被允许的键,确保referencedValue的合法取值范围严格可控。- 动态方案需要使用支持Draft 2020-12的验证工具(比如Ajv v8及以上版本),如果工具版本较低,只能采用静态枚举的方式。
内容的提问来源于stack exchange,提问作者Lukas Grebe
相关产品推荐
相关产品推荐

