【问题标题】:How to add multiple conditions in JSON schema?如何在 JSON 模式中添加多个条件?
【发布时间】:2022-02-08 01:00:39
【问题描述】:

我有以下 JSON 架构

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "op": {
        "type": "string",
        "minLength": 1,
        "enum": [
          "add",
          "remove",
          "replace"
        ]
      },
      "path": {
        "type": "string",
        "minLength": 1,
        "enum": [
          "/name",
          "/description",
          "/prefix"
        ]
      },
      "value": {
        "type": "string",
        "minLength": 1
      }
    },
    "additionalProperties": false,
    "required": [
      "op",
      "path",
      "value"
    ],
    "minItems": 1,
    "allOf": [
      {
        "if" : {
          "properties": {
            "path" : {
              "const": "/name"
            }
          }
        },
        "then": {
          "properties": {
            "op": {
              "const": "replace"
            }
          }
        }
      },
      {
        "if" : {
          "properties": {
            "path" : {
              "const": "/description"
            }
          }
        },
        "then": {
          "properties": {
            "op": {
              "const": "replace"
            }
          }
        }
      }
    ]
  }
}

如上我们可以看到,如果名称和描述存在,那么 op 将被替换,对于路径前缀,我拥有所有操作,即添加、删除和替换,但我希望为删除操作应用一个特殊条件 就像如果 path 是 xFix 并且 op 被删除,那么所需的参数不应该包含 value 属性,所以只有 op 和 path。

【问题讨论】:

  • 您能否提供一些应该通过验证的 JSON 数据示例和一些验证失败的 JSON 数据示例?并解释哪些没有按照您的预期进行验证(以及为什么)?

标签: node.js json jsonschema


【解决方案1】:

我想你会想扭转这种逻辑。不要在“必需”列表中包含“值”。相反,添加一个条件,基本上是“如果 op 不是 'remove',则 value 是必需的”。

  {
    "if" : {
      "not": {
        "properties": {
          "op" : {
            "const": "remove"
          }
        }
      }
    },
    "then": {
      "required": ["value"]
    }
  }

【讨论】:

  • 使用这个逻辑,如果我的操作不是删除,它将只需要值,但对于其他操作(除了删除)我想要所有必需的字段,但仅用于删除我想要 op 和 path 不是值
  • 不,我不相信这是真的。顶级“必需”所需的属性始终是必需的。有条件的“必需”只是增加了它们。这就是为什么您需要将逻辑与最初陈述的方式相反,以使其发挥作用 - 您不能用条件“减去”需求。无论如何,如果您不信任它,很容易测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2018-01-23
相关资源
最近更新 更多