unevaluatedProperties与嵌套属性交互及JSON实例有效性验证问询
unevaluatedProperties与嵌套属性的交互规则 直接结论
你给出的JSON实例是完全合法的,根节点的unevaluatedProperties: false不会限制foo的子属性bar。
具体规则拆解
1. 作用范围:仅当前层级
unevaluatedProperties的生效范围严格限定在它所在的Schema层级,只校验当前层级的直接子属性,不会穿透到嵌套的子对象内部。
在你的示例里:
- 根Schema的
properties定义了foo,所以根层级的foo属于"已评估"属性,符合要求。 foo内部的bar属于嵌套对象的层级,根节点的unevaluatedProperties管不到这个层级的属性。
2. 注解收集:层级隔离
你疑惑的注解冒泡,其实是unevaluatedProperties会收集当前层级下所有已评估的属性,但这个收集是层级独立的:
- 根节点的注解只会记录根层级的已评估属性(也就是
foo),不会把foo内部的bar也算进来。 - 嵌套对象的属性是否允许,得看嵌套对象自身的Schema规则。你的示例中
foo对应的Schema是空对象,没有任何限制,所以bar完全合法。
3. 库实现差异的原因
部分验证库结果不一致,是因为2019-09版本的注解机制属于较新的规范,有些库还没完全实现到位。遇到这种情况,以JSON Schema官方规范的定义为准:unevaluatedProperties不跨层级生效。
如何限制嵌套属性
如果要限制foo内部的未知属性,需要在foo的Schema里单独定义unevaluatedProperties: false,示例如下:
{ "$schema": "https://json-schema.org/draft/2019-09/schema", "properties": { "foo": { "unevaluatedProperties": false } }, "unevaluatedProperties": false }
这时你的JSON实例就会验证失败,因为foo里的bar属于未评估属性。
内容的提问来源于stack exchange,提问作者aznan
相关产品推荐
相关产品推荐

