You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:12:33