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

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
}

关键逻辑说明

  1. 递归引用:通过$ref: "#"引用当前根schema,让recursiveProp继承根schema的所有约束(比如必填的reqProp)
  2. 属性扩展:用allOf将根schema引用与新属性newProp的定义合并,实现“根约束+额外属性”的效果
  3. 属性控制:unevaluatedProperties: false确保recursiveProp只能包含根schema的属性和newProp,禁止其他无关属性
  4. 顶层约束:根schema的additionalProperties: false限制顶层只能有reqProp和recursiveProp两个属性

验证测试

用你提供的两个测试用例验证,均会通过:

  • 合法实例1:
{
  "reqProp": "blah"
}
  • 合法实例2:
{
  "reqProp": "blah",
  "recursiveProp": {
    "reqProp": "blah",
    "newProp": "foo"
  }
}

内容的提问来源于stack exchange,提问作者Brendan Quinn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:24