求助:编写符合特定规则的JSON Schema验证数组内属性
解决方案:符合需求的JSON Schema
直接给出满足所有验证场景的Schema(基于JSON Schema Draft 2020-12,需支持contains、maxContains及自定义错误信息的实现,如Ajv):
{ "type": "object", "properties": { "number": { "type": "string" }, "rootProperty": { "type": "array", "items": { "type": "object", "properties": { "property1": {"type": "string"}, "property2": {"type": "string"} }, "additionalProperties": false, "minProperties": 1, "errorMessage": { "additionalProperties": "只能包含property1或property2属性", "minProperties": "数组元素不能为空对象" } }, "allOf": [ { "contains": {"required": ["property1"]}, "maxContains": 1, "errorMessage": { "contains": "缺少必填的property1", "maxContains": "property1不能重复出现" } }, { "contains": {"required": ["property2"]}, "maxContains": 1, "errorMessage": { "contains": "缺少必填的property2", "maxContains": "property2不能重复出现" } } ], "errorMessage": { "type": "rootProperty必须是数组类型" } } }, "required": ["number", "rootProperty"], "additionalProperties": false }
各验证场景的实现说明
- 场景1&2:通过
allOf下的两个contains规则实现——数组必须至少包含一个带property1的元素,且至少包含一个带property2的元素。缺少任意一个都会触发对应错误提示。 - 场景3&4:
contains不限制元素顺序,且单个元素可同时包含两个属性,完全符合需求。 - 场景5:在
items的Schema中设置additionalProperties: false,同时仅定义允许的properties为property1和property2,确保元素对象不能有其他属性。 - 场景6:通过
maxContains: 1限制property1和property2各自最多出现一次,避免重复。
关于你的疑问
JSON Schema是否适合这类深度验证?
完全适合。JSON Schema的contains、maxContains、allOf等关键字专门用于处理跨数组元素的聚合验证,合理组合这些关键字就能实现复杂的全局校验逻辑。
你之前尝试的问题分析
- 用
items直接指定required: ["property1", "property2"]:会强制每个数组元素都必须同时包含两个属性,和你允许属性分散在不同元素的需求冲突,因此报错。 - 使用
contains时出现“对象包含无法匹配的属性”错误:大概率是未正确限制元素的additionalProperties,或者contains的子Schema定义有误,导致元素的额外属性触发校验失败。
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

