JSON 模式验证

JSON Schema oneOf validation

我正在尝试创建一个 JSON 架构,它允许 属性 是数字或特定格式的对象。

我的数据是这样的:

{
  "num": 200
}

我的架构如下所示:

{
  "properties": {
    "num": {
      "type": [
        "number",
        "object"
      ],
      "oneOf": [
        {
          "type": "number"
        },
        {
          "$ref": "#/definitions/Variable"
        }
      ]
    }
  },
  "required": [
    "num"
  ],
  "additionalProperties": false,
  "definitions": {
    "Variable": {
      "title": "Variable",
      "properties": {
        "$variable$": {
          "type": "boolean",
          "example": true
        },
        "name": {
          "type": "string"
        },
        "defaultValue": {
          "type": [
            "string",
            "object",
            "number"
          ]
        }
      },
      "required": [
        "$variable$",
        "name"
      ],
      "additionalProperties": false
    }
  }
}

当我 运行 通过这里的验证器时:https://www.jsonschemavalidator.net/

我收到这个错误:

Message: JSON is valid against more than one schema from 'oneOf'. Valid schema indexes: 0, 1.
Schema path: #/properties/num/oneOf

我假设我遗漏了一些关于 oneOf 工作原理的明显信息,但我不知道它可能对我有什么影响。非常感谢这里的任何帮助,谢谢!

对于你的情况,你根本不需要 oneOf,你可以简单地使用 "type": ["number",{"$ref":"#/definitions/Variable"}] 而不是 "type": ["number","object"]

{
  "properties": {
    "num": {
      "type": [
        "number",{"$ref":"#/definitions/Variable"}
      ]
    }
  },
  "required": [
    "num"
  ],
  "additionalProperties": false,
  "definitions": {
    "Variable": {
      "title": "Variable",
      "properties": {
        "$variable$": {
          "type": "boolean",
          "example": true
        },
        "name": {
          "type": "string"
        },
        "defaultValue": {
          "type": [
            "string",
            "object",
            "number"
          ]
        }
      },
      "required": [
        "$variable$",
        "name"
      ],
      "additionalProperties": false
    }
  }
}

您得到的错误是告诉您你们两个 oneOf 模式都被验证为真。值 4 对以下架构有效可能令人惊讶。

{
  "properties": {
    "foo": { "type": "string": }
  },
  "required": ["foo"]
}

事实证明,当值不是对象时,properties 关键字和 required 关键字不适用。因此,在针对数字(或任何非对象)进行验证时,上述模式实际上是空模式 ({})。因为空模式意味着没有约束,所以一切都是有效的。

要解决您的问题,只需将 "type": "object" 添加到您的 /definitions/Variable 架构。