对于具有递归$ 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_address
,city
,adressInfo
。
您所包含的示例数据是否有效?
以上是关于对于具有递归$ ref的JSONSchema,ajv验证失败的主要内容,如果未能解决你的问题,请参考以下文章
随机森林的REF递归特征消除法来筛选特征(python实现不依赖sklearn)