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

如何强制数组内的对象键名?YAML+JSON Schema场景技术求助

如何在JSON Schema中约束YAML公式数组嵌套对象的键名

我明白你的痛点:已经搞定了公式根节点直接子对象的键名与类型约束,但数组里的嵌套运算对象(比如示例add数组里的subtract),目前只能保证类型正确,没法限制它的键名范围。下面给你具体的解决思路和可直接用的示例:

核心思路

要约束数组中的嵌套对象,核心是递归复用根节点的约束逻辑——因为数组里的每一项,要么是纯数值,要么是和根节点结构完全一致的运算对象(可以是add/subtract这类合法键名的对象)。同时配合additionalProperties: false来禁止非法键名。

完整JSON Schema示例

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "formula": {
      "oneOf": [
        // 允许纯数值
        { "type": "number" },
        // 允许运算对象(add/subtract二选一)
        {
          "type": "object",
          "oneOf": [
            {
              "type": "object",
              "required": ["add"],
              "properties": {
                "add": {
                  "type": "array",
                  // 数组每一项都遵循formula的约束(递归)
                  "items": { "$ref": "#/properties/formula" }
                }
              },
              // 禁止出现add以外的其他键名
              "additionalProperties": false
            },
            {
              "type": "object",
              "required": ["subtract"],
              "properties": {
                "subtract": {
                  "type": "array",
                  "items": { "$ref": "#/properties/formula" }
                }
              },
              "additionalProperties": false
            }
          ]
        }
      ]
    }
  },
  "required": ["formula"]
}

关键细节拆解

  • 递归引用:"$ref": "#/properties/formula"让数组的每一项都继承根节点formula的约束,不管嵌套多少层(比如add里套subtract再套add),都能保持一致的规则。
  • additionalProperties: false:这是限制键名的核心!它会直接拒绝对象中出现Schema未定义的键名,比如如果有人写multiply: [2,3],验证会直接失败。
  • 层级一致性:不管是根节点的运算对象,还是数组里的嵌套运算对象,都只能在add/subtract里二选一,完全符合你要的键名约束需求。

验证你的示例YAML

你的示例代码:

formula: # 等价于 '5 + (3 - 2)'
  add:
    - 5
    - subtract: [3, 2]

用上面的Schema验证会完全通过:

  1. 根节点formula是合法的add对象;
  2. add数组第一项是纯数值,符合约束;
  3. 第二项是合法的subtract对象,且没有多余键名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:21:46