json模式将可选的patternproperties与ref混合

时间:2018-07-05 08:30:14

标签: jsonschema

我是json模式的新手。 我尝试了一些复杂的混合,但效果不如预期。 我有以下json:

{
  "aaa": {
    "Type": "Type1",
    "prop1": "val3"
  },
  "bbb": {
    "Type": "Type1",
    "prop2": "val4"
  }
}

想法是json包含类型为1的对象的json,这些对象具有可变键(属性?)名称,并且可能包含另一个对象(类型2或类型3),并且是唯一的必需属性是Type,其值为Type1

我试图使用以下模式来验证上面的json:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "definitions": {
    "Type1": {
      "type": "object",
      "properties": {
        "Type": {
          "const": "Type1"
        },
        "prop1": {
          "type": "string"
        },
        "prop2": {
          "type": "string"
        }
      },
      "patternProperties": {
        "^[a-zA-Z0-9_]+$": {
          "oneOf": [
            {
              "$ref": "#/definitions/Type2"
            },
            {
              "$ref": "#/definitions/Type3"
            }
          ]
        }
      },
      "required": [
        "Type"
      ],
      "additionalProperties": false
    },
    "Type2": {
      "type": "object",
      "properties": {
        "PropArr": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "Type": {
          "const": "Type2"
        }
      },
      "required": [
        "PropArr",
        "Type"
      ],
      "additionalProperties": false
    },
    "Type3": {
      "type": "object",
      "properties": {
        "Prop": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "Type": {
          "const": "Type3"
        }
      },
      "required": [
        "Prop",
        "Type"
      ],
      "additionalProperties": false
    }
  },
  "patternProperties": {
    "^[a-zA-Z0-9_]+$": {
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/Type1"
        }
      ]
    }
  },
  "minProperties": 1,
  "additionalProperties": false
}

但是我无法验证此json,因为它不包含type1对象的type2或type3。 为模式属性(在Type1中)指定“ oneof”是否意味着它必须包含模式属性?有没有办法使该对象在模式中是可选的?

1 个答案:

答案 0 :(得分:0)

这里很少有问题和误解。没关系。

我将您的架构和JSON实例放入online validator中。我发现这种超级有用的功能可以立即获得有关验证失败原因的反馈。

您想采用的方法是正确的,但是实现有些微。

在完成所有定义后,从patternProperties开始,您已声明每个属性(与模式匹配)必须具有作为对象的值。好。该对象必须是您正确引用的Type1

Type1的定义中,您使用了propertiespatternProperties。正在将patternProperties应用于您在properties中已指定的属性,因为它不排除在其他基于“属性”的关键字中找到的属性。 additionalProperties(可能是模式)仅适用于propertiespatternProperties尚未涵盖的那些属性。

  

带有“ additionalProperties”的验证仅适用于子级   与“属性”中的任何名称都不匹配的实例名称的值,   并且不匹配“ patternProperties”中的任何正则表达式。

Draft-7 validations additionalProperties

希望此说明以及指向在线验证器的链接(该链接可提供有用的验证失败消息)将使您能够继续进行自己的模式。当我看不到更多可能的实例json数据时,为您提供更正的架构会有些困难。