我正在尝试使用另一个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
}
验证type
:的验证JSON
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" }]
}
}
}
此时,架构刚刚被重构。所有行为都没有改变,只是你现在有了一个放置自定义约束的地方,所以它们只适用于你想要的地方。从这里添加约束应该相对简单。
{
"$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...
}
}
}