JSON Schema结合$ref与unevaluatedProperties扩展递归属性的问题
JSON Schema递归扩展属性的正确实现方法
你遇到的问题是操作方式有误,JSON Schema 2020-12完全支持“属性内容包含根schema所有约束+额外属性”的需求。
错误原因分析
验证失败的核心问题是未正确通过组合关键字合并根schema约束与新属性定义,且unevaluatedProperties的使用逻辑不匹配:
- 若直接给
recursiveProp设置递归引用后单独定义新属性,未用allOf合并的话,新属性会被默认或显式的additionalProperties: false拦截 - 报错中“未评估属性不允许”的提示,说明递归引用的约束未被正确纳入属性评估范围
正确Schema写法
以下是满足需求的完整schema,关键是用allOf组合根schema引用与新属性定义,配合unevaluatedProperties控制属性范围:
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://example.com/root-schema", "type": "object", "properties": { "reqProp": { "type": "string" }, "recursiveProp": { "allOf": [ { "$ref": "#" }, { "properties": { "newProp": { "type": "string" } } } ], "unevaluatedProperties": false } }, "required": ["reqProp"], "additionalProperties": false }
关键逻辑说明
- 递归引用:通过
$ref: "#"引用当前根schema,让recursiveProp继承根schema的所有约束(比如必填的reqProp) - 属性扩展:用
allOf将根schema引用与新属性newProp的定义合并,实现“根约束+额外属性”的效果 - 属性控制:
unevaluatedProperties: false确保recursiveProp只能包含根schema的属性和newProp,禁止其他无关属性 - 顶层约束:根schema的
additionalProperties: false限制顶层只能有reqProp和recursiveProp两个属性
验证测试
用你提供的两个测试用例验证,均会通过:
- 合法实例1:
{ "reqProp": "blah" }
- 合法实例2:
{ "reqProp": "blah", "recursiveProp": { "reqProp": "blah", "newProp": "foo" } }
内容的提问来源于stack exchange,提问作者Brendan Quinn
相关产品推荐
相关产品推荐

