是否可在JSON Schema定义中引用自身数据校验内部数据完整性?
JSON Schema 内部数据完整性校验实现方案
首先可以明确:完全可以通过JSON Schema实现你要的内部数据一致性校验,不需要额外写运行时检查逻辑就能识别"ba"这类非法值。
原写法误区说明
你之前的写法存在概念混淆:
$ref是用来引用JSON Schema内部定义的其他schema结构,无法指向待校验的业务数据实例中的字段值- 要引用当前待校验实例的字段,需要使用JSON Schema 2020-12规范提供的
$data关键字
正确的Schema写法
你只需要将name字段的enum配置修改为通过$data指向实例的childNames数组即可,JSON Pointer路径写/childNames:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://tbd.com/foo/bar", "type": "object", "properties": { "childNames": { "type": "array", "items": { "type": "string" } }, "children": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "enum": { "$data": "/childNames" } } }, "required": ["name"] } } }, "required": ["childNames", "children"] }
校验效果
用你给出的示例数据校验时,children[1].name的值ba不在childNames数组的取值范围内,会直接触发enum校验错误,符合你的需求。
注意事项
使用前需要确认你所用的JSON Schema校验器支持2020-12版本的$data特性,主流校验器如Ajv v8及以上版本均已兼容该特性。
内容的提问来源于stack exchange,提问作者zeitiger
相关产品推荐
相关产品推荐

