在oneOf中使用多个anyOf

时间:2018-10-18 11:37:08

标签: json schema jsonschema

我想创建一个架构,其中我将在“ oneOf”中包含多个对象,该对象将具有anyOf格式的许多对象,其中某些键可以是必需的类型(此部分有效) 我的架构:-

{
    "description": "schema v6",
    "type": "object",
    "oneOf": [
    {
    "properties": {
    "Speed": {
      "items": {
        "anyOf": [
          {
            "$ref": "#/definitions/speed"
          },
          {
            "$ref": "#/definitions/SituationType"
          }
        ]
      },
      "required": [
        "speed"
      ]
    }
  },
  "additionalProperties": false
        }
      ],
      "definitions": {
        "speed": {
          "description": "Speed",
          "type": "integer"
        },
        "SituationType": {
          "type": "string",
          "description": "Situation Type",
          "enum": [
            "Advice",
            "Depend"
              ]
            }
          }
        }

但是当我尝试验证此架构但我能够验证一些不正确的值时,例如

    {
      "Speed": {
        "speed": "ABC",//required
        "SituationType1": "Advisory1" //optional but key needs to be correct
      }
    }
我期望的

正确答复是

    {
      "Speed": {
        "speed": "1",
        "SituationType": "Advise" 
      }
    }

1 个答案:

答案 0 :(得分:0)

首先,您需要正确设置架构类型,否则实施可能会假设您使用的是最新的JSON架构版本(当前为draft-7)。

因此,在架构根目录中,您需要以下内容:

"$schema": "http://json-schema.org/draft-06/schema#",

第二,items仅在目标是数组的情况下适用。 当前,您的架构仅检查以下内容:

  

如果根对象的属性为“ Speed”,则它的键必须为   “速度”。根对象不得具有任何其他属性。

没有别的。

您对definitions的使用以及如何引用它们可能不是您想要的。

您似乎希望Speed包含speed,它必须是整数,而可选的SituationType必须是字符串,受枚举限制,并且没有其他内容。

这是我基于此的架构,它根据给定的示例数据正确地通过和失败:

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "oneOf": [
    {
      "properties": {
        "Speed": {
          "properties":{
            "speed": {
              "$ref": "#/definitions/speed"
            },
            "SituationType": {
              "$ref": "#/definitions/SituationType"
            }
          },
          "required": [
            "speed"
          ],
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    }
  ],
  "definitions": {
    "speed": {
      "description": "Speed",
      "type": "integer"
    },
    "SituationType": {
      "type": "string",
      "description": "Situation Type",
      "enum": [
        "Advice",
        "Depend"
      ]
    }
  }
}

您需要定义Speed的属性,因为否则您将无法避免其他属性,因为additionalProperties仅受相邻的properties键影响。我们希望在草案8中创建一个新关键字来支持这种行为,但是在您的示例(Huge Github issue in relation)中看起来并不需要它。

现在将additionalProperties的false添加到Speed模式中可以防止该对象中的其他键。

我怀疑给定您的问题标题,此处可能会有更多的方案在起作用,并且您已针对此问题进行了简化。如果您有一个更复杂的问题的更详细的架构,我也很乐意提供帮助。