具有子模式验证的 AJV 自定义关键字

问题描述 投票:0回答:1

我正在使用 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
中的每个可能模式返回错误,这是我不想要的。

javascript jsonschema ajv
1个回答
0
投票

就其价值而言,我设法使用

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
实例)并设置需要作为函数本身属性的错误。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.