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

如何在$defs中利用上层Schema的fieldA值为fieldD添加约束?

当然可以,用JSON Schema的条件约束就能实现

你完全可以借助JSON Schema Draft 2020-12里的if/then/else关键字,根据fieldA的布尔值给fieldD添加数组大小约束。

下面是修改后的示例Schema,我给你加了具体的约束逻辑:当fieldA为true时,fieldD数组至少要有2个元素;当fieldA为false时,fieldD数组最多只能有1个元素。

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
        "fieldA": {
            "type": "boolean"
        },
        "fieldB": {
            "type": "object",
            "$ref": "#/$defs/fieldB"
        }
    },
    "$defs": {
        "fieldB": {
            "type": "object",
            "properties": {
                "fieldC": {
                    "type": "string"
                },
                "fieldD": {
                    "$ref": "#/$defs/fieldD"
                }
            }
        },
        "fieldD": {
            "type": "array"
        }
    },
    // 核心条件约束部分
    "if": {
        "properties": {
            "fieldA": { "const": true }
        },
        "required": ["fieldA"]
    },
    "then": {
        "properties": {
            "fieldB": {
                "properties": {
                    "fieldD": {
                        "minItems": 2
                    }
                },
                "required": ["fieldD"] // 不需要强制fieldD存在的话可以删掉这行
            }
        }
    },
    "else": {
        "properties": {
            "fieldB": {
                "properties": {
                    "fieldD": {
                        "maxItems": 1
                    }
                }
            }
        }
    }
}

逻辑说明:

  • if块:匹配fieldA为true的场景,同时要求fieldA必须存在
  • then块:当if条件满足时,fieldB.fieldD必须是至少包含2个元素的数组(如果保留required,还会强制fieldD必须出现)
  • else块:当fieldA为false或不存在时,fieldB.fieldD最多只能有1个元素

你可以根据实际需求调整minItems、maxItems的数值,也可以修改required规则来控制fieldD是否为必填项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:13:20