我只是想知道是否可以使用json架构根据实际输入数据本身对输入数据进行验证。
说我有一个对象:
{
parts: {
123: {
happy: 'me'
}
},
cells: [{
part_id: 123,
some: 'other property'
}, {
part_id: 124,
some: 'thing else'
}]
}
我可以编写一个json模式来确保单元格对象的part_id实际上对应于传入的一个零件对象吗?
换句话说,part_id: 123
是可以接受的,但part_id: 124
不会。
谢谢!
答案 0 :(得分:2)
经过一些研究后,看起来JSON Schema v5已经通过$data reference
属性提供了功能。
以下是来自javascript架构验证器ajv: https://www.npmjs.com/package/ajv#data-reference
$ data reference
使用v5选项,您可以使用验证数据中的值作为架构关键字的值。有关其工作原理的更多信息,请参阅v5提案。
关键字支持$ data reference :constant,enum,format,maximum / minimum,exclusiveMaximum / exclusiveMinimum,maxLength / minLength,maxItems / minItems,maxProperties / minProperties,formatMaximum / formatMinimum,formatExclusiveMaximum / formatExclusiveMinimum,multipleOf,pattern,required,uniqueItems。
“$ data”的值应该是相对的JSON指针。
实施例
此架构要求较小的属性值小于或等于较大属性中的值:
var schema = {
"properties": {
"smaller": {
"type": number,
"maximum": { "$data": "1/larger" }
},
"larger": { "type": number }
}
};
var validData = {
smaller: 5,
larger: 7
};
此架构要求属性具有与其字段名称相同的格式:
var schema = {
"additionalProperties": {
"type": "string",
"format": { "$data": "0#" }
}
};
var validData = {
'date-time': '1963-06-19T08:30:06.283185Z',
email: 'joe.bloggs@example.com'
}
$ data reference被安全地解析 - 即使某些属性未定义,它也不会抛出。如果$ data解析为undefined,则验证成功(排除常量关键字)。如果$ data解析为错误类型(例如,对于最大关键字不是“number”),则验证失败。