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

