对于具有递归$ ref的JSONSchema,ajv验证失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于具有递归$ ref的JSONSchema,ajv验证失败相关的知识,希望对你有一定的参考价值。

我使用“ajv”:“^ 6.5.1”进行JSONSchema验证。提到的JSONSchema具有adressInfo字段的递归引用,这是必填字段。

我收到验证失败错误:

[{ “关键字”: “需要”, “数据路径”: “billing_address.adressInfo.adressInfo”, “schemaPath”: “#/需要”, “PARAMS”:{ “missingProperty”: “STREET_ADDRESS”}, “消息” :“应该有必需的属性'street_address'”}]

我应该为这种类型的JSONSchema做什么,因为它需要每个级别的adressInfo。这是我的脚本:

var Ajv = require('ajv');

var addressJsonSchema = {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "additionalProperties": false,
    "definitions": {
        "address": {
            "type": "object",
            "properties": {
                "street_address": {
                    "type": "string"
                },
                "city": {
                    "type": "string"
                },
                "adressInfo": {
                    "$ref": "#/definitions/address"
                }
            },
            "required": ["street_address", "city", "adressInfo"]
        }
    },
    "type": "object",
    "properties": {
        "billing_address": {
            "$ref": "#/definitions/address"
        }
    }
}

var ajv = new Ajv({
    schemaId: '$id',
    meta: false,
});

var metaSchema = require('../node_modules/ajv/lib/refs/json-schema-draft-07.json');
ajv.addMetaSchema(metaSchema);
ajv._opts.defaultMeta = metaSchema.$id;

var inputData = {
    "billing_address": {
        "street_address": "Viman Nagar",
        "city": "pune",
        "adressInfo": {
            "street_address": "Chandan Nagar",
            "city": "pune",
            "adressInfo": {}
        }
    }
}
try {
    var validate = ajv.compile(addressJsonSchema);
    var valid = validate(inputData);
    if (!valid) {
        console.log('Validation failed error:');
        console.log(JSON.stringify(validate.errors));
    } else {
        console.log("successfully done validation");
    }
} catch (e) {
    console.log(e);
}
答案

您已经创建了一个无法满足的模式。通过说adressInfo是必需的,这是一个address ...必须有adressInfo,这是一个address ...

您的架构是无限递归的。

在您的示例数据中,您有... billing_address> address> adressInfo> adressInfo

根据您的模式,示例数据中最深的adressInfo必须具有属性street_addresscityadressInfo

您所包含的示例数据是否有效?

以上是关于对于具有递归$ ref的JSONSchema,ajv验证失败的主要内容,如果未能解决你的问题,请参考以下文章

依赖注入递归组件的用法

随机森林的REF递归特征消除法来筛选特征(python实现不依赖sklearn)

2017-03-05函数基础函数四种结构ref和out参数递归

16.如何优雅地获取跨层级组件实例(拒绝递归)

vue3中的ref()

基于枚举的 JSON Schema 切换对象属性