使用另一个 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
定义 enum
与 properties
中存在的 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" }
)。不要忘记更改 patternProperties
和 additionalProperties
以及 properties
。 anyOf
等其他关键字应继续引用通用架构 ({ "$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...
}
}
}
我正在尝试使用另一个 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
定义 enum
与 properties
中存在的 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" }
)。不要忘记更改 patternProperties
和 additionalProperties
以及 properties
。 anyOf
等其他关键字应继续引用通用架构 ({ "$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...
}
}
}