【问题标题】:Ajv doesn't validate JSON Schema when using "anyOf" with "requred"将“anyOf”与“requred”一起使用时,Ajv 不验证 JSON 架构
【发布时间】:2021-12-05 22:53:08
【问题描述】:

我有一个 JSON Schema,它允许对象具有一个或多个属性:

"properties": {
  "alpha": {
    "$ref": "#/$defs/alpha"
  },
  "beta": {
    "$ref": "#/$defs/beta"
  }
},
"anyOf": [
  {
    "required": [
      "alpha"
    ]
  },
  {
    "required": [
      "beta"
    ]
  }
]

使用 ajv compile 并启用 strict 模式来验证架构本身,验证失败。我该如何解决?


更新

看起来这是一个已知问题,目前无法解决:


我已尝试在 properties 上使用 anyOf,但虽然此架构验证,但它无法按预期工作:

"anyOf": [
  {
    "properties": {
      "alpha": {
        "$ref": "#/$defs/alpha"
      }
    },
    "required": [
      "alpha"
    ]
  },
  {
    "properties": {
      "beta": {
        "$ref": "#/$defs/beta"
      }
    },
    "required": [
      "beta"
    ]
  }
]
Ajv 命令
ajv compile --spec=draft2020 --validate-formats=true --verbose --all-errors --strict=true -c ajv-formats -s repro.json
Ajv 错误
schema repro.json is invalid
error: strict mode: required property "beta" is not defined at "repro.json#/anyOf/0" (strictRequired)
完整的 JSON 架构
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$ref": "#/$defs/root",
  "$defs": {
    "root": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "alpha": {
          "$ref": "#/$defs/alpha"
        },
        "beta": {
          "$ref": "#/$defs/beta"
        }
      },
      "anyOf": [
        {
          "required": [
            "alpha"
          ]
        },
        {
          "required": [
            "beta"
          ]
        }
      ]
    },
    "alpha": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "foo": {
          "type": "string"
        }
      }
    },
    "beta": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "bar": {
          "type": "string"
        }
      }
    }
  }
}
JSON 示例
{
  "alpha": {
    "foo": "xyz"
  }
}

【问题讨论】:

    标签: json jsonschema ajv


    【解决方案1】:

    您需要禁用严格模式,该模式认为任何required 关键字都需要与这些属性相邻的properties

    或者,您可以将属性定义移动到 anyOf 子句中 - 但您必须在两侧重复它们,这不是很好(否则您可以同时存在两个属性但其中一个不根据他们的架构进行验证)。

    所以试试这个:

      "$defs": {
        "root": {
          "type": "object",
          "anyOf": [
            {
              "required": [
                "alpha"
              ],
              "properties": {
                "alpha": {
                  "$ref": "#/$defs/alpha"
                },
                "beta": {
                  "$ref": "#/$defs/beta"
                }
              },
              "additionalProperties": false,
            },
            {
              "required": [
                "beta"
              ],
              "properties": {
                "alpha": {
                  "$ref": "#/$defs/alpha"
                },
                "beta": {
                  "$ref": "#/$defs/beta"
                }
              },
              "additionalProperties": false
            }
          ]
        }
      },
      ...
    

    【讨论】:

    • 谢谢!你能添加一个anyOf 的例子吗?正如我所提到的,我的尝试不起作用。
    • @beatcracker 已编辑。
    • 谢谢,不幸的是,虽然您的架构示例使用 strict=true 进行验证,但它实际上并没有验证输入数据:jsonschemavalidator.net/s/RWvtM82s
    • 该链接中的数据有效。有什么问题?
    • 它不应该验证,根据架构:jsonschemavalidator.net/s/JspXqdWv
    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 2019-11-19
    • 2016-08-23
    • 1970-01-01
    • 2018-09-13
    • 2012-03-30
    • 2019-07-24
    • 2017-04-29
    相关资源
    最近更新 更多