首页 > 解决方案 > 存在用于验证列表之一中的至少一个元素的 Jsonschema

问题描述

我有一个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 - 为空,我会得到验证异常,这不是我需要的。我需要在任何列表中有一个元素,有什么想法吗?

标签: jsonjsonschema

解决方案


您需要将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
        }
      }
    }
  ]
}

推荐阅读