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

时间:2019-02-25 06:56:50

标签: node-modules jsonschema ajv

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

我收到验证失败错误:

  

[{“” keyword“:” required“,” dataPath“:”。billing_address.adressInfo.adressInfo“,” schemaPath“:”#/ required“,” 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);
}

1 个答案:

答案 0 :(得分:1)

您创建了一个无法满足的架构。 通过说adressInfo是必需的,这是一个address ...,它必须具有adressInfo,这是一个address ...

您的架构是无限递归的。

在示例数据中,您有... billing_address>地址> adressInfo> adressInfo

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

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