我正在使用 AJV 基于某些 JSON 架构来验证 JSON。
我想定义一个自定义关键字,根据数据的某些条件应用子模式的验证(基本上是更灵活的版本
discriminator
)。
例如:
{
"mykeyword": {
"even": {
"properties": {
"p": {"type": "string"}
}
},
"odd": {
"properties": {
"p": {"type": "number"}
}
}
}
"type": "object",
"properties": {
"n": "number"
}
}
我想弄清楚如何实现以下逻辑:
if ( data.n % 2 == 0 )
validate(schema.even, data)
else
validate(schema.odd, data)
意味着根据某些条件选择正确的模式进行验证。
似乎可以使用
code
自定义关键字定义,但 他们的文档 仅提供了简单的示例。
对于我实际用例的一些上下文:模式在
oneOf
中有其定义,我只想验证正确的定义,但提供的 discriminator
不足以确定要验证哪个模式。不这样做会导致 AJV 为 oneOf
中的每个可能模式返回错误,这是我不想要的。
就其价值而言,我设法使用
validate
而不是 code
编写了关键字。看起来像这样:
{
keyword: "mykeyword",
validate: function validate_mykeyword(schema, data, parent_schema, data_cxt)
{
var sub_schema = get_schema_id_based_on_condition(data, schema);
if ( sub_schema === undefined )
{
validate_mykeyword.errors = [{
message: "Custom error",
instancePath: data_cxt.instancePath,
parentSchema: parent_schema,
}];
return false;
}
var validate = this.getSchema(sub_schema);
if ( !validate(data, data_cxt) )
{
validate_mykeyword.errors = validate.errors;
return false;
}
return true;
}
}
一些值得注意的事情:
validate
必须是一个命名函数,这样你才能正确获取this
值(它将被设置为Ajv
实例)并设置需要作为函数本身属性的错误。