如何复用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
相关产品推荐
相关产品推荐

