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

如何复用JSON subschema对未知数量同结构子对象做全量校验

问题核心原因

你当前的写法仅对显式声明的Object1做了校验,根节点的additionalProperties: true配置会让其余未显式声明的属性跳过校验规则,这就是其他自定义对象没有触发校验的原因。

解决方案

JSON Schema提供了$defs字段用来存放可复用的子schema,配合$ref引用 + 根节点的additionalProperties指定子schema规则,就能实现「根对象下所有属性都匹配同一份子schema」的需求,适配未知数量的自定义键场景。
以下是修改后的完整schema:

{
    "$id": "http://example.com/example.json",
    "$schema": "http://json-schema.org/draft-07/schema",
    "required": [
        "Object1"
    ],
    "title": "The root schema",
    "type": "object",
    "$defs": {
        "commonItem": {
            "required": [
                "Title",
                "Description"
            ],
            "title": "The Reusable Object schema",
            "type": "object",
            "properties": {
                "Title": {
                    "title": "The Title schema",
                    "type": "string"
                },
                "Description": {
                    "title": "The Description schema",
                    "type": "string"
                }
            },
            "additionalProperties": false
        }
    },
    "properties": {
        "Object1": {
            "$ref": "#/$defs/commonItem"
        }
    },
    "additionalProperties": {
        "$ref": "#/$defs/commonItem"
    }
}

规则说明

  • 可复用的子schema统一存放在$defs字段下,避免重复编写相同规则,后续修改也只需要改动一处
  • 根节点的additionalProperties不再设为true,而是直接指向我们定义的公共子schema,所有未在properties中显式声明的属性都会自动匹配这份规则
  • 你原本的思路是完全合理的,$defs + $ref的用法本质就是JSON Schema层面的「定义一次,多处实例化使用」,和面向对象的类实例逻辑高度契合

内容的提问来源于stack exchange,提问作者Jeff B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:15:04