15.1 JSON schema- 创建基础样例

1.使用vite创建项目

1.create-vue (当前官方首选推荐)

npm create vue@latest

2.vite 创建简洁模板

pnpm create vite 选择vue+ts

3.Vue CLI (经典且稳定) 创建完整模板

npm install -g @vue/cli vue create my-project

2. JSON Schema使用

定义json数据结构

校验数据结构

生成表单

参考网站ajv.js.org/guide/getti...

参考网站([json-schema.org/)https://j...](https://link.juejin.cn?target=https%3A%2F%2Fjson-schema.org%2F)%255Bhttps%3A%2F%2Fjson-schema.org%2F "https://json-schema.org/)%5Bhttps://json-schema.org/")

参考网站(www.npmjs.com/package/ajv...https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fajv-errors "https://www.npmjs.com/package/ajverrors)https://www.npmjs.com/package/ajv-errors")]

1.安装及使用ajv

npm install ajv 创建test-schmal文件夹,创建demo.ts文件

ts 复制代码
import Ajv from "ajv"
const ajv = new Ajv() // options can be passed, e.g. {allErrors: true}

const schema = {
  type: "object",
  properties: {
    foo: {type: "integer"},
    bar: {type: "string"},
    email: {type: "string", format: "email"}
  },
  required: ["foo"],
  additionalProperties: false
}

const validate = ajv.compile(schema)

const data = {

  foo: 1,
  bar: "abc"
}
console.log('第一个demo开始执行了')
const valid = validate(data)
if (!valid) console.log(validate.errors)

执行demo.ts文件,控制台输出如下

bash 复制代码
[
  {
    instancePath: '/foo',
    schemaPath: '#/properties/foo/type',
    keyword: 'type',
    params: { type: 'integer' },
    message: 'must be integer'
  }
]

2.使用format

www.npmjs.com/package/ajv...

字段支持的类型数据

1. 使用ajv.addFormat,ajv.addKeyword配置自定义

ts 复制代码
import Ajv from "ajv"
import addFormats from 'ajv-formats'
const ajv = new Ajv() // options can be passed, e.g. {allErrors: true}
addFormats(ajv)

// 自定义格式验证函数
ajv.addFormat("test-abc", (data: string) => {
    return data==="abc"
})
// 自定义关键字验证函数
ajv.addKeyword({
    keyword: "isFoo2",
    validate: (schema, data) => {
        console.log('自定义关键字2', schema, data)
        return true
    },
})
ajv.addKeyword({
    keyword: "isFoo3",
    // 编译函数,返回一个验证函数
    compile: (schema, data) => {
        console.log('自定义关键字3', schema, data)
        return ()=>data.isFoo2
    },
    
    metaSchema: {
        //  属性值所属类型
        type: "string"
    }
})

ajv.addKeyword({
    keyword: "isFoo4",
    // 返回值为插入到对应变量的属性中
    macro: (schema, data) => {
        console.log('自定义关键字4', schema, data)
        //
        return {
            minLength: 16
        }
    },
    
    metaSchema: {
        //  属性值所属类型
        type: "string"
    }
})
const schema = {
  type: "object",
  properties: {
    foo: {type: "integer"},
    bar: {type: "string"},
    errors: false,
    test: {type: "string", format: "test-abc"},// 自定义格式验证函数必须是abc
    test2: {type: "string", isFoo2: true},// 自定义关键字validate验证函数
    test3: {type: "string", isFoo3: "string"},// 自定义关键字compile验证函数
    test4: {type: "string", isFoo4: "string"},// 自定义关键字macro验证函数
    email: {type: "string", format: "email"}
  },
  required: ["foo"],
  additionalProperties: false
}

const validate = ajv.compile(schema)

const data = {
  foo: 1,
  bar: "abc",
  test: "abc",
  test2: "abc",
  test3: "abcdefg",
  test4: "abcdefg",
  email: "591822202@qq.com"
}
console.log('第一个demo开始执行了')
const valid = validate(data)
if (!valid) console.log(validate.errors)

3.国际化ajv-i18n

(www.npmjs.com/package/ajv...%255Bhttps%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fajv-i18n "https://www.npmjs.com/package/ajv-i18n)%5Bhttps://www.npmjs.com/package/ajv-i18n")]

4.如何转换错误语言自定义

ts 复制代码
import Ajv from "ajv"
import addFormats from 'ajv-formats' // 添加内置格式验证函数
import localize from "ajv-i18n" // 添加内置本地化验证函数
const ajv = new Ajv() // options can be passed, e.g. {allErrors: true}
addFormats(ajv)

// 自定义格式验证函数
ajv.addFormat("test-abc", (data: string) => {
    return data==="abc"
})
// 自定义关键字验证函数
ajv.addKeyword({
    keyword: "isFoo2",
    validate: (schema, data) => {
        console.log('自定义关键字2', schema, data)
        return true
    },
})
ajv.addKeyword({
    keyword: "isFoo3",
    // 编译函数,返回一个验证函数
    compile: (schema, data) => {
        console.log('自定义关键字3', schema, data)
        return ()=>data.isFoo3
    },
    
    metaSchema: {
        //  属性值所属类型
        type: "string"
    }
})

ajv.addKeyword({
    keyword: "isFoo4",
    // 返回值为插入到对应变量的属性中
    macro: (schema, data) => {
        console.log('自定义关键字4', schema, data)
        //
        return {
            minLength: 6
        }
    },
    
    metaSchema: {
        //  属性值所属类型
        type: "string"
    }
})
// 自定义报错信息
ajv.addKeyword({
    keyword: "isFoo5",
    validate: function fun(schema, data)  {
        console.log('自定义关键字5', schema, data)
        fun.errors = [
  {
    instancePath: '/test5',
    schemaPath: '#/properties/foo/type',
    keyword: 'type',
    params: { type: 'aaaa' },
    message: '自定义提示错误展示'
  }
]
// 自定义关键字5验证函数,返回false表示校验失败
        return true
    },
})
const schema = {
  type: "object",
  properties: {
    foo: {type: "string"},
    bar: {type: "string"},
    errors: false,
    test: {type: "string", format: "test-abc"},// 自定义格式验证函数必须是abc
    test2: {type: "string", isFoo2: true},// 自定义关键字验证函数
    test3: {type: "string", isFoo3: "string"},// 自定义关键字验证函数
    test4: {type: "string", isFoo4: "string"},// 自定义关键字验证函数
    test5: {type: "string", isFoo5: "string"},// 自定义关键字验证函数
    email: {type: "string", format: "email"}
  },
  required: ["foo"],
  additionalProperties: false
}

const validate = ajv.compile(schema)

const data = {
  foo: "133",
  bar: "abc",
  test: "abc",
  test2: "abc",
  test3: "abcdefg",
  test4: "abcdefg",
  test5: "1234",
  email: "591822202@qq.com"
}
console.log('第一个demo开始执行了')
const valid = validate(data)
// 校验失败报错
if (!valid) {
    // 多语言-转换成中文报错
    localize.zh(validate.errors)
    console.log(validate.errors)
}

5.自定义错误信息ajv-errors

www.npmjs.com/package/ajv...

自定义报错因为国际化转换导致失败

相关推荐
程序员黑豆7 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC8 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea8 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望8 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少9 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0079 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis10 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝11 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师11 小时前
新兴多智能体系统的模式与问题
前端
用户0595401744612 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css