gpt4 book ai didi

javascript - 使用 AJV 解析无效对象的自定义架构

转载 作者:行者123 更新时间:2023-12-03 05:19:19 26 4
gpt4 key购买 nike

我正在尝试找到一种方法来更改模式验证,以找到最适合给定对象的模式。假设我们有一个架构:

{
"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 自定义关键字来完成此操作,而无需重建架构本身?特别是,如果架构对于对象无效,是否可以使用自定义关键字来覆盖它并使其有效?

最佳答案

如果目标是仅报告正确架构中的错误,您可以使用 "switch" (使用 v5 选项,它从版本 5.0.0 移至 ajv-keywords)或 "if/then/else" (建议这样做,因为它可能会添加到 JSON Schema 草案 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 存储在某个变量中,以便在验证后您可以看到使用了哪个。

如果您需要获取实际架构,您可以这样做:

var validate = ajv.getSchema('schema#/definitions/a'); // validating function
var schema = validate.schema; // schema as JSON

关于javascript - 使用 AJV 解析无效对象的自定义架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41463802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com