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



我正在尝试使用另一个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作为基元类型,因此我不确定如何将验证根级别的typetype定义为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将无效。

我可以用什么方法将根typeenum定义为不同于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" }(。不要忘记更改patternPropertiesadditionalProperties以及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...
}
}
}

相关内容

  • 没有找到相关文章

最新更新