JSON Schema
一个简单的JSON Schema 对象类型:
{
type: 'object',
properties: {
name: { type: 'string', format: 'email' },
age: { type: 'number' },
},
required: ['name'],
}
上述的 schema 表示一个类型为对象,其中有两个属性,分别为name与age,name为必选字符串类型,格式验证规则为按照邮箱格式验证,age为可选数字类型
ajv
AJV(Another JSON Schema Validator)是一个用于在JavaScript中验证数据是否符合JSON Schema规范的库。它支持快速、高效的验证,尤其在处理大规模数据时表现优异。
ajv使用:
首先安装ajv以及 ajv-formats(可选)
ajv-formats 是一个提供额外格式验证功能的库。它允许你在使用 AJV 验证 JSON Schema 时,轻松支持一些常见的格式检查,如邮箱、日期、URI等。
yarn install ajv ajv-formats
pnpm install ajv ajv-formats
新建一个schema-test.js,导入依赖
//导入依赖
import Ajv from "ajv"
import addFormats from 'ajv-formats'
在下方编写一个schema
//编写schema
const schema = {
type: 'object',
properties: {
// 要使用format,需要安装ajv-formats
name: { type: 'string', format: 'email' },
age: { type: 'number' },
},
required: ['name'],
}
创建ajv实例
//创建一个ajv实例
const ajv = new Ajv()
添加常用formats支持
//添加常用formats支持
addFormats(ajv)
创建schema验证器,并输入测试用例进行验证
//编译schema
const validate = ajv.compile(schema)
//使用创建好的schema验证器验证一个对象
const valid = validate({ name: '1qq.com' })
//验证对象合法性,如果不合法,打印错误信息
if (!valid) console.log(validate.errors);
自定义验证器(addFormat)
除了官方的format验证规则,我们自己也可以编写一个自定义的验证器:
//自定义format
ajv.addFormat('test', (data) => {
console.log('test', data)
return data === '1qq.com'
})
自定义关键字
通过 ajv.addKeyword,你可以扩展 AJV 的功能,定义自己的验证规则或功能,而不仅仅依赖于标准的 JSON Schema 关键词。比如,你可以添加一个自定义的验证器,或者添加一些特定的数据处理逻辑。
//编写schema
const schema = {
type: 'object',
properties: {
// 要使用format,需要安装ajv-formats
name: { type: 'string', eq6: false },
age: {
type: 'number'
},
},
required: ['name'],
}
//ajv其余逻辑...
//自定义关键字
ajv.addKeyword('eq6', {
validate: (schema, data) => {
console.log(schema, data);
if (schema === true) {
return true
}
return data.length === 6
},
// compile(schema, parentSchema) {
// //parentSchema: { type: 'string', eq6: false }
// console.log(1, schema, parentSchema);
// //返回一个函数
// return () => true
// },
metaSchema: {
//定义这个eq6的数据类型
type: 'boolean'
},
macro() {
//返回一个对象,这个对象会被合并到schema中
return {
minLength: 6,
}
}
})
//ajv其余逻辑...
错误信息国际化
如果我们在使用ajv时候需要不同语言的错误提示,可以安装ajv-i18n
库:
pnpm i ajv-i18n
yarn i ajv-i18n
使用:
import localize from 'ajv-i18n'
/* 代码省略... */
//验证对象合法性,如果不合法,打印错误信息
if (!valid) {
//中文
localize.zh(validate.errors)
console.log(validate.errors)
}
自定义错误信息
//导入依赖
import Ajv from "ajv"
import addFormats from 'ajv-formats'
import ajvErrors from 'ajv-errors'
//编写schema
const schema = {
type: 'object',
properties: {
// 要使用format,需要安装ajv-formats
name: {
type: 'string', eq6: true,
},
age: {
type: 'number'
},
},
required: ['name'],
errorMessage: {
type: '应为对象',
eq6: '长度必须是6',
properties: {
name: 'name长度必须是6'
}
}
}
//创建一个ajv实例
const ajv = new Ajv({ allErrors: true })
//添加常用formats支持
addFormats(ajv)
//添加自定义errors
ajvErrors(ajv)
//自定义关键字
ajv.addKeyword('eq6', {
validate: (schema, data) => {
console.log(schema, data);
return data.length === 6
},
errors: true,
})
//编译schema
const validate = ajv.compile(schema)
//使用创建好的schema验证器验证一个对象
const valid = validate({ name: '12345' })
//验证对象合法性,如果不合法,打印错误信息
if (!valid) {
console.log(validate.errors)
}