如何用JSON Schema验证属性名与嵌套name字段值匹配?
解决方案:强制属性名与嵌套
name值匹配 当然可以实现这个要求!在JSON Schema Draft 06及后续版本中,你可以利用$data关键字(用来引用实例中的其他值)结合patternProperties,让外层属性名和对应的嵌套name属性值强制保持一致。
修改后的JSON Schema
{ "$schema": "http://json-schema.org/draft-06/schema#", "type": "object", "patternProperties": { "^\\w[-\\w_]*$": { "$ref": "#/definitions/source" } }, "additionalProperties": false, "definitions": { "source": { "type": "object", "properties": { "name": { "type": "string", "const": { "$data": "1#" } }, "standalone": { "type": "boolean" } }, "required": ["name", "standalone"], "additionalProperties": false } } }
关键逻辑说明
$data: "1#"是JSON Pointer语法,这里的1#指向当前source对象的父级键名(也就是外层的属性名,比如你示例中的"a")。- 通过给
name属性添加const约束,要求它的值必须和外层属性名完全匹配,不匹配的实例就会验证失败。
验证效果测试
对于你给出的失败案例:
{ "a": { "name": "b", "standalone": false } }
这个实例会验证失败,因为外层属性名是"a",但嵌套的name值是"b",不符合const的约束要求。
注意事项
$data关键字从JSON Schema Draft 06开始引入,确保你使用的验证工具支持该版本及以上(比如Ajv、JSON Schema Validator等主流工具都支持)。- 保持原来的
patternProperties规则,确保外层属性名符合你定义的命名规范(^\w[-\w_]*$)。
内容的提问来源于stack exchange,提问作者Bram Speeckaert
相关产品推荐
相关产品推荐

