如何使用JSON Schema的anyOf与not筛选对象元素组合并排除指定元素
JSON Schema元素组合筛选解决方案
原始Schema修正说明
首先修正你提供的原始Schema中的语法问题:$defs里的对象定义需要将属性放在properties字段下,并添加required确保必填属性存在:
{ "$schema": "http://json-schema.org/draft-04/schema#", "$id": "https://example.com/schemas/long-schema", "type": "object", "properties": { "propA": { "$ref": "#/$defs/objectA" }, "propB": { "$ref": "#/$defs/objectB" }, "propC": { "$ref": "#/$defs/objectC" } }, "$defs": { "objectA": { "type": "object", "properties": { "a": { "type": "string", "enum": ["A"] } }, "required": ["a"] }, "objectB": { "type": "object", "properties": { "b": { "type": "string", "enum": ["B"] } }, "required": ["b"] }, "objectC": { "type": "object", "properties": { "c": { "type": "string", "enum": ["C"] } }, "required": ["c"] } } }
需求1:允许B、C的任意组合(单个B/单个C/B+C),禁止A
你的原写法错误在于:not直接引用objectA是验证值不符合objectA的定义,但我们需要禁止propA属性存在;同时需要确保至少包含B或C中的一个(避免空对象)。正确写法使用allOf组合两个约束:
{ // 保留上述修正后的schema结构... "allOf": [ { "not": { "required": ["propA"] } }, // 禁止出现propA属性 { "anyOf": [ { "required": ["propB"] }, { "required": ["propC"] } ] } // 至少包含B或C中的一个 ], "$comment": "Choose objects B, C or B & C, but not A" }
需求2:允许A、B的任意组合(单个A/单个B/A+B),禁止C
同理,通过allOf组合“禁止propC”和“至少包含A或B”两个约束:
{ // 保留上述修正后的schema结构... "allOf": [ { "not": { "required": ["propC"] } }, // 禁止出现propC属性 { "anyOf": [ { "required": ["propA"] }, { "required": ["propB"] } ] } // 至少包含A或B中的一个 ], "$comment": "A and B but not C, allowing any combination of A and B" }
关键语法说明
not: { "required": ["propX"] }:用于禁止对象包含propX属性,这是实现“排除某个元素”的核心。allOf:用于同时满足多个约束条件(比如“禁止某属性”+“至少有一个允许的属性”)。anyOf:用于满足多个条件中的任意一个(比如“有B”或“有C”)。
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

