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

如何基于已有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54