如何基于已有JSON Schema扩展数组成员的命令属性?
正确实现JSON Schema命令扩展的方法
核心思路是将基础命令的类型定义抽离为可复用片段,再在进阶Schema中组合基础命令与新增命令,避免直接覆盖commands数组的原有定义。
1. 基础Schema(含simple_command_1、simple_command_2)
把基础命令规则单独放在$defs里,方便后续引用扩展:
{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": ["commands"], "properties": { "commands": { "type": "array", "items": { "$ref": "#/$defs/base_command" } } }, "$defs": { "base_command": { "type": "object", "oneOf": [ { "type": "object", "required": ["simple_command_1"], "properties": { "simple_command_1": { "type": "object", "properties": { "param1": { "type": "string" } } } } }, { "type": "object", "required": ["simple_command_2"], "properties": { "simple_command_2": { "type": "object", "properties": { "param2": { "type": "number" } } } } } ] } } }
2. 进阶Schema(继承基础命令+新增advanced_command_3)
通过allOf组合基础Schema,并扩展commands.items的规则,将基础命令和新增命令合并:
{ "$schema": "http://json-schema.org/draft-07/schema#", "allOf": [ { "$ref": "./基础Schema文件路径.json" } // 替换为你的基础Schema实际路径 ], "properties": { "commands": { "type": "array", "items": { "oneOf": [ { "$ref": "#/$defs/base_command" }, // 引用基础命令规则 { "type": "object", "required": ["advanced_command_3"], "properties": { "advanced_command_3": { "type": "object", "properties": { "param3": { "type": "boolean" }, "param4": { "type": "array", "items": { "type": "string" } } } } } } ] } } }, // 若基础Schema与进阶Schema分离,需复制base_command的定义到此处,或用绝对路径引用公共片段 "$defs": { "base_command": { "type": "object", "oneOf": [ { "type": "object", "required": ["simple_command_1"], "properties": { "simple_command_1": { "type": "object", "properties": { "param1": { "type": "string" } } } } }, { "type": "object", "required": ["simple_command_2"], "properties": { "simple_command_2": { "type": "object", "properties": { "param2": { "type": "number" } } } } } ] } } }
关键说明:
- 直接覆盖
properties.commands会替换基础Schema的对应属性,而非合并。必须在items.oneOf中同时包含基础命令和新增命令,才能实现“继承+扩展”。 - 若想避免重复代码,可把
base_command的定义放在独立公共Schema文件中,让基础Schema和进阶Schema都引用该公共片段。
内容的提问来源于stack exchange,提问作者Liviu Gelea
相关产品推荐
相关产品推荐

