如何用JSON Schema校验数组A包含数组B的所有元素
正确的JSON Schema写法:校验数组A包含数组B的全部元素
之前写法的问题
你用minContains结合$data的思路存在核心错误:
minContains要求传入数值,用来指定数组至少包含多少个符合子Schema的元素,直接引用数组B本身是无效的。- 就算改成引用B的长度(
{"$data": "/B/length"}),也只能保证A的长度≥B,无法确保B的每个元素都存在于A中,比如A=[1,3], B=[1,2]这种情况会错误通过校验。
正确的Schema实现
以下是能满足需求的JSON Schema(支持Draft 2020-12或支持$data关键字的版本):
{ "type": "object", "properties": { "A": { "type": "array" }, "B": { "type": "array" } }, "required": ["A", "B"], "allOf": [ { "$dynamicRef": "#/$defs/elementMustBeInA", "$data": "/B/*" } ], "$defs": { "elementMustBeInA": { "properties": { "A": { "contains": { "const": {"$data": "0"} } } } } } }
工作原理
- 顶层规则:限定输入为包含
A、B两个数组的对象,且这两个属性为必填项。 allOf+$data:遍历B数组的每一个元素(通过/B/*路径),对每个元素应用$defs中的校验规则。elementMustBeInA规则:要求数组A必须包含当前遍历到的B元素(通过{"$data": "0"}引用当前遍历的B元素)。
验证你的示例
- 合法用例1:
A=[1,2,3], B=[1,2]→ B的每个元素都在A中,校验通过。 - 合法用例2:
A=[1,2], B=[1,2]→ 所有元素匹配,校验通过。 - 非法用例:
A=[1,2], B=[1,2,3]→ B中的3不在A中,校验失败。
内容的提问来源于stack exchange,提问作者clove682
相关产品推荐
相关产品推荐

