使用另一个 JSON 模式验证 JSON 模式

Validate JSON Schema with another JSON Schema

我正在尝试使用另一个 JSON 架构来验证 JSON 架构。

要验证的 JSON 架构示例:https://jsonschema.net/home

用于验证上述架构的验证架构参考:https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-draft-07.json

我有一个要求,其中 property 只能是原始类型,即 string, number, integer, boolean。 由于 JSON 模式的根应该有 type 作为 object 并且它里面的所有 properties 将有 type 作为原始类型,我不知道应该如何我定义了 type 定义,该定义将根级别的 type 验证为 object,而 properties 内部的 type 作为原始类型。

样本JSON:

{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "http://example.com/example.json",
    "type": "object",
    "title": "The root schema",
    "description": "The root schema comprises the entire JSON document.",
    "default": {},
    "examples": [
        {
            "name": "A green door"
        }
    ],
    "required": [
        "name"
    ],
    "properties": {
        "name": {
            "$id": "#/properties/name",
            "type": "string",
            "title": "The name schema",
            "description": "An explanation about the purpose of this instance.",
            "default": "",
            "examples": [
                "A green door"
            ]
        }
    },
    "additionalProperties": true
}

验证 JSON 验证 type:

  definitions: {
    simpleTypes: {
      enum: ['array', 'boolean', 'integer', 'null', 'number', 'object', 'string'],
    }
  },
  properties: {
  type: {
      anyOf: [
        { $ref: '#/definitions/simpleTypes' },
      ],
    },
  }

从上面的simpleTypes -> enum如果我删除object,我的JSON就失效了。

我可以为根 type 定义 enumproperties 中存在的 type 不同的任何方式?

首先复制 draft-07 架构并为其指定一个唯一的 $id

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "definitions": {
    ...original-definitions...
  },
  ...original-schema...
}

由于您希望在不同的地方对模式有不同的约束,因此您需要将模式重构为一个定义,以便它可以在不同的情况下被引用和扩展。不要忘记更改所有递归引用 ({ "$ref": "#" }) 以指向您创建的定义 ({ "$ref": "#/definitions/schema" })。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "alllOf": [{ "$ref": "#/definitions/schema" }],
  "definitions": {
    ...original-definitions-with-modified-$refs...
   "schema": {
      ...original-schema-with-modified-$refs...
    }
  }
}

接下来您需要添加另一个特定于 属性 模式的定义,并更改 属性 模式的 $refs 以使用创建的定义 ({ "$ref": "#/definitions/property-schema" })。不要忘记更改 patternPropertiesadditionalProperties 以及 propertiesanyOf 等其他关键字应继续引用通用架构 ({ "$ref": "#/definitions/schema" })。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "alllOf": [{ "$ref": "#/definitions/schema" }],
  "definitions": {
    ...original-definitions-with-modified-$refs...
    "schema": {
      ...original-schema-with-modified-$refs...
    },
    "property-schema": {
      "allOf": [{ "$ref": "#/definitions/schema" }]
    }
  }
}

此时,架构刚刚重构。 None 的行为发生了变化,只是您现在可以放置自定义约束,因此它们只会应用到您希望的位置。从这里添加约束应该相对简单。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://example.com/my-custom-draft-07-schema",
  "alllOf": [{ "$ref": "#/definitions/schema" }],
  ...add-root-schema-constraints-here...
  "definitions": {
    ...original-definitions-with-modified-$refs...
    "schema": {
      ...original-schema-with-modified-$refs...
      ...add-global-constraints-here...
    },
    "property-schema": {
      "allOf": [{ "$ref": "#/definitions/schema" }]
      ...add-property-schema-constraints-here...
    }
  }
}