json_schema + ajv
2021-08-31 本文已影响0人
wyc0859
json_schema: 用于是描述你的JSON数据和规范格式
网站: http://json-schema.org/
不需要安装
ajv: 是JSON Schema的验证工具
网站: https://ajv.js.org/
安装:
yarn add ajv -S
yarn add ajv-errors -S
yarn add ajv-i18n -S
yarn add ajv-formats -S
如果上面代码报错,请执行下2句:
npm config set registry https://registry.npm.taobao.org
npm config set disturl https://npm.taobao.org/dist
简单示例代码
const Ajv = require('ajv')
const localize = require('ajv-i18n') //中文
//pets会警告,因为它定义了不受约束的元组。
//要定义一个正好包含 2 个元素的元组, 需minItems:2,additionalItems: false
const schema = {
type: 'object',
properties: {
name: {
type: 'string'
},
age: {
type: 'number',
},
pets: {
type: 'array',
items: [
{
type: 'string',
},
{
type: 'number',
}
],
// minItems:2,
// additionalItems: false
}
},
required: ['name', 'age']
}
const ajv = new Ajv()
const validate = ajv.compile(schema)
const valid = validate({
name: 'haha',
age: "18a",
pets: ['mimi', 12]
})
if (!valid) {
localize.zh(validate.errors) //将报错信息转为中文
console.log(validate.errors)
}
format
内置format和自定义format
const Ajv = require("ajv")
const localize = require('ajv-i18n')
const addFormats = require("ajv-formats") //**引入**
const ajv = new Ajv()
addFormats(ajv)
const schema = {
type: 'object',
properties: {
name: {
type: 'string',
format:'email' //***内置****
},
age: {
type: "number",
format:'qy' //****自定义***
}
},
required: ['name']
}
//自定义
ajv.addFormat("qy", {
type: "number",
validate: (x)=>{
return x>5?true:false
}
})
const validate = ajv.compile(schema)
const valid = validate({
name: 'haha@qq.com',
age:1
})
if (!valid) {
localize.zh(validate.errors) //将报错信息转为中文
console.log(validate.errors)
}
关键字
关键字是3种类型
1、 "validate" function
2、 "compile" function
3、 "macro" function
const Ajv = require("ajv")
const localize = require('ajv-i18n') //中文
const ajv = new Ajv()
const schema = {
type: 'object',
properties: {
name: {
type: 'string',
test3: false
}
},
required: ['name']
}
// validate类型
ajv.addKeyword('test1', {
validate(schema, data) {
console.log("普通:",schema, data)
if (schema === true) return true
else return data.length === 6
},
})
// compile类型
ajv.addKeyword('test2', {
compile(sch, parentSchema) {
console.log("compile:",sch, parentSchema)
return (x) => {
if(x.length===6){
return true
}else{
return false
}
}
}
})
// macro型
ajv.addKeyword('test3', {
macro() {
return {
minLength: 10,
}
},
})
const validate = ajv.compile(schema)
const valid = validate({
name: 'ha12ha'
})
if (!valid) {
localize.zh(validate.errors) //将报错信息转为中文
console.log(validate.errors)
}
自定义错误
const Ajv = require("ajv").default
const localize = require('ajv-i18n') //中文
const ajv = new Ajv({allErrors: true})
require("ajv-errors")(ajv /*, {singleError: true} */)
const schema = {
type: "object",
properties: {
name: {
type: 'string',
minLength:10,
errorMessage: { //单个属性验证的错误提示
type:"name必须是string",
minLength:"name长度不能小于10"
}
},
age: {
type: 'number'
},
},
required: ['name'],
//errorMessage: "name或age错误", //这里是统一设置错误,无论是name还是age错,都会报这句
}
const validate = ajv.compile(schema)
const valid = validate({
name: "abc1221",
age: 3
})
if (!valid) {
console.log(validate.errors)
console.log("*****************")
localize.zh(validate.errors) //将报错信息转为中文
}else{
console.log("通过")
}