我正在使用“ 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);
}
答案 0 :(得分:1)
您创建了一个无法满足的架构。
通过说adressInfo
是必需的,这是一个address
...,它必须具有adressInfo
,这是一个address
...
您的架构是无限递归的。
在示例数据中,您有... billing_address>地址> adressInfo> adressInfo
根据模式,示例数据中最深的adressInfo
必须具有属性street_address
,city
,adressInfo
。
您所包含的示例数据是否有效?