首页 文章

json模式使用ref混合可选的patternproperties

提问于
浏览
1

我是json架构的新手 . 我尝试了一些复杂的混合,它不像我预期的那样工作 . 我有以下json:

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

想法是json包含具有Type1的对象的jsons,其具有变量key(属性?)名称, may 包含另一个对象(Type2或Type3),并且唯一的强制属性是Type为Type1的Type

我尝试使用以下架构来验证上面的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 . 为模式属性指定“oneof”(在Type1中)意味着它必须包含图案属性?有没有办法在架构中使该对象可选?

1 回答

  • 0

    这里几乎没有问题和误解 . 没关系 .

    我将您的架构和JSON实例放入online validator . 我发现这对于获得验证失败原因的即时反馈非常有帮助 .

    您想采取的方法是正确的,但实施稍有偏差 .

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

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

    使用“additionalProperties”进行验证仅适用于与“properties”中的任何名称都不匹配的实例名称的子值,并且不匹配“patternProperties”中的任何正则表达式 .

    Draft-7 validations additionalProperties

    希望这个解释和在线验证器的链接(提供有用的验证失败消息)将允许您使用您的架构 . 当我看不到更多可能的实例json数据时,给你一个更正的架构有点困难 .

相关问题