如何使用Ajv JSON Schema校验器实现字段值大小关系校验?
使用Ajv校验字段间的数值大小关系
要实现字段间的数值比较校验(比如确保minPrice不大于maxPrice),最标准的方式是利用Ajv支持的$data关键字——这是JSON Schema Draft 2019-09及后续版本纳入的扩展,完全符合标准规范。
核心思路
通过$data关键字,你可以在Schema中引用其他字段的值,结合minimum/exclusiveMinimum(校验大于/大于等于)或maximum/exclusiveMaximum(校验小于/小于等于)规则,实现字段间的比较。
1. 校验某个字段的值大于另一个字段
比如要确保price严格大于basePrice,可以这样定义Schema:
const Ajv = require('ajv'); const ajv = new Ajv({ $data: true }); // 必须启用$data选项 const schema = { type: 'object', properties: { price: { type: 'number', // 用$data引用同级的basePrice,exclusiveMinimum表示严格大于 exclusiveMinimum: { $data: '1/basePrice' }, errorMessage: 'price必须严格大于basePrice' // 可选:自定义错误提示 }, basePrice: { type: 'number' } }, required: ['price', 'basePrice'] }; const validate = ajv.compile(schema); // 测试合法数据 console.log(validate({ price: 15, basePrice: 10 })); // true // 测试非法数据 console.log(validate({ price: 8, basePrice: 10 })); // false console.log(validate.errors[0].message); // "price必须严格大于basePrice"
2. 确保minPrice不大于maxPrice(触发校验错误)
要实现minPrice > maxPrice时抛出错误,只需在minPrice的规则中添加maximum约束,并用$data引用maxPrice:
const schema = { type: 'object', properties: { minPrice: { type: 'number', // minPrice必须小于等于maxPrice maximum: { $data: '1/maxPrice' }, errorMessage: 'minPrice不能大于maxPrice' }, maxPrice: { type: 'number' } }, required: ['minPrice', 'maxPrice'] }; const validate = ajv.compile(schema); // 非法情况:minPrice > maxPrice const invalidData = { minPrice: 30, maxPrice: 20 }; console.log(validate(invalidData)); // false console.log(validate.errors[0].message); // "minPrice不能大于maxPrice"
关键说明
$data的值是JSON Pointer:1/表示当前对象的同级属性(比如1/maxPrice指向和minPrice同级的maxPrice字段)。- 必须在初始化Ajv时启用
{ $data: true },否则$data关键字不会生效。 - 如果需要非严格比较(比如大于等于),就用
minimum代替exclusiveMinimum;小于等于用maximum,严格小于用exclusiveMaximum。
内容的提问来源于stack exchange,提问作者Tiago Bértolo
相关产品推荐
相关产品推荐

