[英]Customized schema resolving for invalid objects with AJV
我正在尝试找到一种更改方案验证的方法,以为给定对象找到最合适的方案。 假设我们有一个模式:
{
"oneOf": [
{
"$ref": "#/definitions/a"
},
{
"$ref": "#/definitions/b"
}
],
"definitions": {
"a": {
"type": "object",
"properties": {
"prop1": {
"enum": ["x"]
}
},
"required": ["prop1"]
},
"b": {
"type": "object",
"properties": {
"prop1": {
"enum": ["y"]
},
"prop2": {
"type": "string"
}
},
"required": ["prop1", "prop2"]
}
}
}
现在,如果我有一个对象{ "prop1": "y" }
,那么我希望它从#/definitions/b
类型开始解析,即使它对于该方案不是真的有效。 也就是说,我只想使用prop1
属性进行解析。
我想知道是否有一种方法可以使用AJV自定义关键字而不重建架构本身? 特别是,如果架构对于对象无效,是否可以使用自定义关键字覆盖它并使之有效?
如果目标是仅报告来自正确模式的错误,则可以使用“开关” (带有v5选项,将其从版本5.0.0移至ajv关键字 )或“如果/然后/否则” (建议使用它可能会添加到JSON模式草案7中):
{
"id": "schema",
"if": { "properties": { "prop1": { "const": "x" } } },
"then": { "$ref": "#/definitions/a" },
"else": { "$ref": "#/definitions/b" }
}
如果您需要知道用于验证的架构,可以使用自定义关键字对其进行注释:
{
"id": "schema",
"if": { "properties": { "prop1": { "const": "x" } } },
"then": {
"allOf": [
{ "schemaUsed": "schema#/definitions/a" },
{ "$ref": "#/definitions/a" }
]
},
"else": {
"allOf": [
{ "schemaUsed": "schema#/definitions/b" },
{ "$ref": "#/definitions/b" }
]
}
}
应该定义关键字以在验证期间将模式ID存储在某个变量中,以便在验证之后可以看到使用了哪个ID。
如果您需要获取实际的架构,则可以执行以下操作:
var validate = ajv.getSchema('schema#/definitions/a'); // validating function
var schema = validate.schema; // schema as JSON
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.