You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:25