Json模式用于具有复杂条件的Json模式



我需要验证给定的JSON模式实例是否遵循某些规则。大多数规则可以对照其他模式进行检查,但我无法使用模式检查两个条件:

  1. 对于每个"object"类型,"properties"中的每个属性也必须在"required"列表中
  2. "$schema"必须并且只能位于架构的根目录中

事实上,我已经通过在python脚本中创建自定义验证器成功地验证了这些条件,但我想知道,
是否可以纯粹通过使用JSON模式来检查这些条件?

如果你好奇,你可以看到我正在使用的当前模式,尽管这对我的问题来说不是必要的:

{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"types": {
"object": {
"_comment": "object type",
"isType": "object",
"properties": {
"type": {"enum": ["object"]},
"properties": {
"type": "object",
"additionalProperties": {"$ref": "#/definitions/schema"},
},
"additionalProperties": {"enum": [False]},
"required": {"type": "array"},
"description": {"type": "string", "maxLength": 128},
"$id": {"type": "string", "maxLength": 128}
},
"dependencies": {
"properties": ["required"],
"required": ["properties"]
},
"required": ["additionalProperties"],
"allRequired": True,  # custom validator for requiring all properties
"additionalProperties": False
},
... # extra types that not really relevant
},
"schema": {
"oneOf": [
{"$ref": "#/definitions/types/object"},
{"$ref": "#/definitions/types/string"},
{"$ref": "#/definitions/types/number"},
{"$ref": "#/definitions/types/array"},
{"$ref": "#/definitions/types/enum"},
{"$ref": "#/definitions/types/anyOf"},
],
},
},
"type": "object",
"$ref": "#/definitions/schema"
}

如果你不知道这是否可能,也许你可以帮我解决其中一个问题:

  1. 是否可以引用正在验证的当前实例(类似于"$ref":"#"指的是当前架构(
  2. 是否可以以某种方式使用"依赖项"验证器来验证条件1
  1. 对于每个"object"类型,"properties"中的每个属性也必须在"required"列表中

无法完成,因为。。。

  1. 是否可以引用正在验证的当前实例(类似于"$ref":"#"指的是当前架构(

否。有人提出了一个类似$data的关键字,但这个概念存在太多问题,所以它从未实现。

  1. 是否可以以某种方式使用"依赖项"验证器来验证条件1

否。

  1. '$schema'必须并且只能位于架构的根目录中

这个你可以做;模式";定义了一切。然后您可以扩展";模式";在根模式中要求CCD_ 2或在子模式中禁止CCD_。

{
"$schema": "http://json-schema.org/draft-07/schema#",
"allOf": [{ "$ref": "#/definitions/schema" }],
"required": ["$schema"],
"definitions": {
"schema": {
"type": "object",
"properties": {
"$id": { "type": "string", "format": "uri" },
"$schema": { "type": "string", "format": "uri" },
"properties": {
"type": "object",
"additionalProperties": { "$ref": "#/definitions/sub-schema" }
}
},
"additionalProperties": false
},
"sub-schema": {
"allOf": [{ "$ref": "#/definitions/schema" }],
"not": { "required": ["$schema"] }
}
}
}

不,这在JSON架构中是不可能的。不能引用实例数据。

最新更新