Jsonschema 用于验证其中一个列表中的至少一个元素是否存在

Jsonschema to validate at least one element in one of the lists is present

我有一个json,像这样:

{
  "listA": [
    {
      "prop1": "mine"
    },
     {
      "prop1": "mine"
    }
  ],
  "listB": [
    {
      "prop1": "mine"
    }
  ],
  "propsForAll": {
    "property1": "value",
    "property2": "value"
  }
}

我需要 json 架构来验证任何列表中至少有一个元素存在 {listA, listB, listC}

目前,我的架构如下所示:

 "properties": {
 .....
    "listA": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/elementA"
      },
      "minItems": 1
    },
    "listB": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/elementB"
      },
      "minItems": 1
    },
    "listC": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/elementC"
      },
      "minItems": 1
    },
.....
  },
.....
  "anyOf": [
    {
      "required": [
        "listA"
      ]
    },
    {
      "required": [
        "listB"
      ]
    },
    {
      "required": [
        "listC"
      ]
    }
  ],

但是如果我有一个包含一个元素的 listA 和一个空的 listC,我会得到验证异常,这不是我需要的。 我需要在任何列表中包含一个元素,有什么想法吗?

您需要将 minItems: 1 约束移动到您的 anyOf 子模式。

这是一个现场演示:https://jsonschema.dev/s/RszNl

{
  "properties": {
    "listA": {
      "type": "array",
      "items": {
 
      }
    },
    "listB": {
      "type": "array",
      "items": {

      }
    },
    "listC": {
      "type": "array",
      "items": {

      }
    }
  },
  "anyOf": [
    {
      "required": [
        "listA"
      ],
      "properties": {
        "listA": {
          "minItems": 1
        }
      }
    },
    {
      "required": [
        "listB"
      ],
      "properties": {
        "listB": {
          "minItems": 1
        }
      }
    },
    {
      "required": [
        "listC"
      ],
      "properties": {
        "listC": {
          "minItems": 1
        }
      }
    }
  ]
}