You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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"}
          }
        }
      }
    }
  }
}

工作原理

  1. 顶层规则:限定输入为包含A、B两个数组的对象,且这两个属性为必填项。
  2. allOf + $data:遍历B数组的每一个元素(通过/B/*路径),对每个元素应用$defs中的校验规则。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:45:04