当且仅当另一个属性的值与常量匹配时,如何使用 JSON Schema 来要求特定属性?

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

我已经知道如何根据另一个属性的值有条件地要求一个属性的存在。我正在寻找的也是相反的。

就我而言,我有一个名为“type”的属性,它可以有多个值。如果类型等于常量“enum”,那么我还需要存在一个名为“enum”的属性。但我还想要的是,如果存在“enum”属性但“value”不等于常量“enum”,我希望它验证失败。

这是我目前拥有的:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.org/schemas/field",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "group": {
      "type": "string"
    },
    "title": {
      "$ref": "i18n.schema.json"
    },
    "description": {
      "$ref": "i18n.schema.json"
    },
    "type": {
      "type": "string",
      "enum": [
        "boolean",
        "string",
        "strings",
        "path",
        "enum",
        "map",
        "integer",
        "password"
      ]
    },
    "default": {
      "$ref": "value.schema.json"
    },
    "required": {
      "type": "boolean"
    },
    "dependencies": {
      "type": "array",
      "items": {
        "$ref": "dependency.schema.json"
      }
    },
    "enum": {
      "type": "string"
    },
    "map": {
      "$ref": "map.schema.json"
    }
  },
  "required": [
    "name",
    "title",
    "type"
  ],
  "anyOf": [
    {
      "if": {
        "properties": {
          "type": {
            "const": "enum"
          }
        }
      },
      "then": {
        "required": [
          "enum"
        ]
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "map"
          }
        }
      },
      "then": {
        "required": [
          "map"
        ]
      }
    }
  ],
  "additionalProperties": false
}
jsonschema
1个回答
0
投票

我认为您要问的是以下内容:

如果

type: enum
,那么
enum: something
但不是
enum: enum

"allOf": [
    {
      "if": {
        "properties": {
          "type": {
            "const": "enum"
          }
        }
      },
      "then": {
        "required": [
          "enum"
        ],
        "properties": {
          "enum": {
            "not": {
              "const": "enum"
            }
          }
        }
      }
    }
  ]
© www.soinside.com 2019 - 2024. All rights reserved.