JSON 模式:如何检查数组 A 至少包含数组 B 的所有值

问题描述 投票:0回答:1

我希望数组 A 至少包含属性数组 B 的所有元素。
以下是一些示例:

// valid
{
"A": [1,2,3],
"B": [1,2]
}

// valid
{
"A": [1,2],
"B": [1,2]
}

// invalid
{
"A": [1,2],
"B": [1,2,3]
}

JSON Schema 草案没有具体要求

我找到了这个答案,它与我的需求类似:Is it possible in json schema to Define a Constraint Between Two Properties

我尝试使用:

  • minContains 和 $data
{
...
"propertires": {
  "A": {
    "minContains": {"$data": "1/B"}
  },
  "B": {
    ...
  }
}
}

结果:无效的测试用例也能通过

json jsonschema json-schema-validator python-jsonschema
1个回答
0
投票

问题是 minContains 用于计算出现次数。尝试下面的架构。

{
      "$schema": "http://json-schema.org/draft-07/schema#",
      "type": "object",
      "required": ["A", "B"],
      "properties": {
        "A": {
          "type": "array",
          "items": {
            "type": "number"
          }
        },
        "B": {
          "type": "array",
          "items": {
            "type": "number"
          }
        }
      },
      "allOf": [
        {
          "$ref": "#/definitions/arrayContainment"
        }
      ],
      "definitions": {
        "arrayContainment": {
          "if": {
            "properties": {
              "B": {
                "minItems": 1
              }
            }
          },
          "then": {
            "allOf": [
              {
                "$comment": "For each item in B, it must exist in A",
                "allOf": [
                  {
                    "$data": "/B/*/",
                    "propertyNames": {
                      "enum": { "$data": "/A" }
                    }
                  }
                ]
              }
            ]
          }
        }
      }
    }

测试用例

    // valid
{
"A": [1,2,3],
"B": [1,2]
}

// valid
{
"A": [1,2],
"B": [1,2]
}

// invalid
{
"A": [1,2],
"B": [1,2,3]
}
© www.soinside.com 2019 - 2024. All rights reserved.