如何编写满足默认Color与数组项校验规则的JSON Schema?
解决JSON Schema的条件校验问题
我明白你遇到的困扰了——你需要实现「要么有全局默认Color字段,要么列表中所有项都必须指定Color」的校验规则,之前用anyOf的写法没达到预期,核心问题是第二个分支没有明确排除全局Color的存在,同时对List项的约束逻辑没有正确生效。
问题分析
你原来的anyOf第二个分支仅定义了List的items需要Color,但没有限制全局Color不能存在;再加上顶层properties中已经定义了List的基础结构,分支里的List规则没能正确覆盖校验逻辑。我们需要调整anyOf的两个分支,让它们互斥且覆盖所有合法场景:
- 场景1:存在全局
Color字段(此时List项可自由选择是否包含Color) - 场景2:不存在全局
Color字段,且List数组中每一项都必须包含Color字段
修正后的JSON Schema
{ "type": "object", "properties": { "List": { "type": "array", "items": { "$ref": "#/definitions/Item" } }, "Color": { "type": "string" } }, "definitions": { "Item": { "type": "object", "properties": { "Color": { "type": "string" } } } }, "anyOf": [ { "required": ["Color"] }, { "not": { "required": ["Color"] }, "properties": { "List": { "type": "array", "items": { "$ref": "#/definitions/Item", "required": ["Color"] } } }, "required": ["List"] } ] }
关键调整说明
- 场景1(存在全局Color):和你原来的写法一致,用
required: ["Color"]确保全局有Color字段,此时List项无论是否包含Color都能通过校验。 - 场景2(无全局Color且所有List项有Color):
- 用
not: { "required": ["Color"] }明确限制全局Color不能存在 - 对List的
items添加required: ["Color"],强制每一项都必须包含Color字段 - 添加
required: ["List"],避免「无全局Color且无List」的非法场景通过校验(如果你的业务允许List不存在,可移除这一行)
- 用
测试用例验证
- 合法示例1(有全局Color):
{"List": [{"Color": "red"}, {}], "Color": "grey"}→ 通过 - 合法示例2(无全局Color,所有List项有Color):
{"List": [{"Color": "red"}, {"Color": "blue"}]}→ 通过 - 非法示例(无全局Color,存在List项无Color):
{"List": [{"Color": "red"}, {}]}→ 不通过 - 非法示例(无全局Color且无List):
{}→ 不通过(移除required: ["List"]则会通过)
这样调整后,校验器就能正确识别两个分支的规则,完美匹配你的业务需求啦!
内容的提问来源于stack exchange,提问作者user122049
相关产品推荐
相关产品推荐

