Json Ajv:如何利用自定义关键字的$data引用?
我正在我的项目中使用。我正试图通过Json Ajv:如何利用自定义关键字的$data引用?,json,jsonschema,json-schema-validator,ajv,Json,Jsonschema,Json Schema Validator,Ajv,我正在我的项目中使用。我正试图通过ajv.addKeywordapi的帮助添加自定义关键字。我可以通过这样做添加关键字(从文档中借用): 但是看起来,$dataref还不支持自定义字段。如文档中所述,$data ref仅支持以下字段 关键字中支持$data引用:常量、枚举、格式、, 最大/最小,排他最大/排他最小,最大长度/ minLength、maxItems/minItems、maxProperties/minProperties、, formatMaximum/formatMinimum,
ajv.addKeyword
api的帮助添加自定义关键字。我可以通过这样做添加关键字(从文档中借用):
但是看起来,$data
ref还不支持自定义字段。如文档中所述,$data ref仅支持以下字段
关键字中支持$data引用:常量、枚举、格式、,
最大/最小,排他最大/排他最小,最大长度/
minLength、maxItems/minItems、maxProperties/minProperties、,
formatMaximum/formatMinimum,formatExclusiveMaximum/
FormatExclusiveMinum、multipleOf、pattern、required、uniqueItems
获取值的一种方法是,我使用validate函数data、dataPath、parentData、parentDataProperty
的参数和write logic来提取由$data
ref定义的字段的值。但我不确定这是否是一种正确的实现方法。有人能帮我吗?这是我的建议。谢谢。挖了一段时间后,我终于成功了。为读者分享解决方案总是好的。这就是我所做的:
// Code goes here
console.clear();
var ajv = new Ajv({
$data: true
});
ajv.addKeyword('range', {
type: 'number',
errors: true,
$data: true, // important part
validate: function(schema, data, parentSchema) {
const {
exclusiveRange: isExclusive
} = parentSchema;
const [min, max] = schema;
if (isExclusive) {
return data > min && data < max;
}
return data >= min && data <= max;
}
});
var schema = {
"properties": {
"smaller": {
"type": "number",
"maximum": {
"$data": "1/larger"
}
},
"larger": {
"type": "number",
// "range": [2, 10],
"range": {
"$data": "1/myRange"
},
"exclusiveRange": true
},
"myRange": {
type: "array",
items: {
type: "number"
}
}
}
};
var validData = {
smaller: 3,
larger: 7,
myRange: [2, 10]
};
let validateData = ajv.compile(schema);
validateData(validData);
console.log(ajv);
console.log('Errors after validations --> ', validateData.errors)
//代码在这里
console.clear();
var ajv=新ajv({
$data:true
});
ajv.addKeyword('范围'{
键入:“编号”,
错误:正确,
$data:true,//重要部分
验证:函数(架构、数据、父架构){
常数{
排他性
}=父模式;
const[min,max]=模式;
如果(isExclusive){
返回数据>最小值&数据<最大值;
}
return data>=min&&data这听起来像是一个功能请求。文档中说你不能做你要求做的事情。我建议你在项目github repo上提交一个问题。我想我已经接近解决方案了。我得到了数据表达式。我只需要对它进行评估。这是我在Ajv中寻找的函数plunker,它是的。如果你有任何想法,请建议。而且一旦我完成了,我会提出一个功能请求。如果可能的话,也提交一个PR。
var schema = {
"properties": {
"smaller": {
"type": "number"
},
"larger": {
"type": "number",
// "range": [2, 10],
"range": {
"$data": "1/myRange" // referencing to myRange
}
},
"myRange": {
type: "array",
items: {
type: "number"
}
}
}
};
// Code goes here
console.clear();
var ajv = new Ajv({
$data: true
});
ajv.addKeyword('range', {
type: 'number',
errors: true,
$data: true, // important part
validate: function(schema, data, parentSchema) {
const {
exclusiveRange: isExclusive
} = parentSchema;
const [min, max] = schema;
if (isExclusive) {
return data > min && data < max;
}
return data >= min && data <= max;
}
});
var schema = {
"properties": {
"smaller": {
"type": "number",
"maximum": {
"$data": "1/larger"
}
},
"larger": {
"type": "number",
// "range": [2, 10],
"range": {
"$data": "1/myRange"
},
"exclusiveRange": true
},
"myRange": {
type: "array",
items: {
type: "number"
}
}
}
};
var validData = {
smaller: 3,
larger: 7,
myRange: [2, 10]
};
let validateData = ajv.compile(schema);
validateData(validData);
console.log(ajv);
console.log('Errors after validations --> ', validateData.errors)