валидация ajv не выполняется для JSONSchema с рекурсивным $ ref - PullRequest
0 голосов
/ 25 февраля 2019

Я использую "ajv": "^ 6.5.1" для проверки JSONSchema.Упомянутая JSONSchema имеет рекурсивную ссылку для поля adressInfo , которое является обязательным полем .

Я получаю ошибку проверки:

[{"ключевое слово": "обязательно", "dataPath": ". Billing_address.adressInfo.adressInfo", "schemaPath": "# / required "," params ": {" missingProperty ":" street_address "}," message ":" должно иметь обязательное свойство '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 голосов
/ 25 февраля 2019

Вы создали схему, которую невозможно удовлетворить.Говоря, требуется adressInfo, то есть address ... который должен иметь adressInfo, то есть address ...

Ваша схема бесконечно рекурсивна.

В данных вашего примера у вас есть ... billing_address> address> adressInfo> adressInfo

Самый глубокий adressInfo в данных вашего примера, согласно вашей схеме, должен иметь свойства street_address, city,adressInfo.

Должны ли приведенные вами примеры данных быть действительными?

...