【问题标题】:ajv validation fails for JSONSchema having recursive $ref具有递归 $ref 的 JSONSchema 的 ajv 验证失败
【发布时间】:2019-07-18 13:07:18
【问题描述】:

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

我收到验证失败错误:

[{"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);
}

【问题讨论】:

  • 从必填字段列表中删除adressInfo

标签: node-modules jsonschema ajv


【解决方案1】:

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

您的架构是无限递归的。

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

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

您包含的示例数据应该有效吗?

【讨论】:

  • 是的,这就是我的意思,实际上每次我需要将所有必需的键放入 adressInfo 中。即 Ajv 总是为上述模式抛出错误。
  • 我不清楚你的目标是什么。您创建了一个无法满足的模式,这不是您的意思。我再说一遍,您包含的示例数据是否有效?您能否修改您的问题以包括应该通过的示例数据,应该失败的示例数据,并解释为什么在这两种情况下,请? =]
  • 明确地说,不可能创建对您问题中的架构有效的 JSON 数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2018-01-20
  • 2019-08-05
  • 2014-02-10
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多