网站首页 > 文章精选 正文
这篇文章主要介绍如何使用json schema,如果你已经对它很熟悉了,可以不用继续往下看了,节约时间。
场景一:
几年前我在我的老东家做发布业务,每天开发表单,对于用户输入的各种数据都要进行校验,校验逻辑写了一堆,特别繁琐。
场景二:
用过webpack的小伙伴肯定知道,在使用webpack之前需要写一个配置文件webpack.config.js。我相信大多数前端并不知道其实webpack的配置有上百个,如果每个配置属性都需要webpack的作者去写一个校验逻辑,那我估计作者就没时间去拓展webpack的功能了。
有没有什么办法去简化这样的校验工作?有,json schema就可以帮我们去做这样的事情。下面开始介绍如何配置json schema,虽然有点枯燥,但是如果你连语法都不清楚,那如何去使用呢?
简单类型
在json schema中有以下几个类型,
- string
- boolean
- null
- enum
- Numeric types
- array
- object
首先来看一下string类型
如图1所示,左侧是schema,右侧是需要验证的数据(也被称为实例)。type是关键字,代表数据的类型,此处我们验证数据是不是字符串,发现结果是ok的。
咱们还可以限制字符串的长度,如下:
minLength代表最小长度,maxLength代表最大长度。也可以通过正则去校验字符串,如下:
pattern属性可以用来写正则,不过普通正则的语法支持的不多,所以如果你发现有些正则关键字不生效,你也不要惊讶。
类型null和boolean比较简单,没什么好说的。
其实枚举也很简单,如下:
{
"type": "string",
"enum": ["red", "amber", "green"]
}
提供几个可选的值,如果枚举的值只有一个,可以使用const属性
{
"type": "string",
"{
"type": "string",
"enum": ["red", "amber", "green"]
}"
"enum": ["red"]
}
类型是Numeric,它有两种写法,一种是integer,它只能是整数,不能是浮点数。另外一种是number,它既可以是整数也可以是浮点数,如下图
图4中,multipleOf属性代表数据只能是这个属性值的倍数,比如上图1.2是0.6的2倍,验证通过,如果数据是1.3,校验就会失败。数字当然也是能够限制大小的,4个属性如下:
接下来就是数组类型——array,用法和上面一样,如果你想校验数组的元素可以用items属性,如下:
上图中additionalItems属性代表数组额外添加的元素的类型,此图中本来只有两个数组元素,如果添加第三,那它必须是bool类型。additionalItems属性也可以直接是bool值,代表允许或者不允许添加额外的元素。还有其他的属性如下:
- minItems和maxItems代表数组的最小长度和最大长度;
- uniqueItems代表数组的元素能否重复;
- contains代表数组必须包含某种类型。
最复杂的就是描述一个对象,类型是object,如下:
如图7所示,可以在properties属性中定义数据的key-value,required代表必须存在的属性。和数组一样,它也有个additionalProperties属性,代表有没有额外的属性添加,用法和数组一样。
用propertyNames属性还可以对key做校验,另外,minProperties和maxProperties可以限制属性的个数。
还有一个有意思的属性是dependencies,它的含义是一个属性存在的前提是另外一个属性也存在。
如图9,属性aa存在的前提是cc属性也存在,如果cc不存在,只有aa,那么就会报错。
结合类型
结合类型有三个
1、anyOf 代表只要匹配一个即可
如上图,anyof数组中匹配任何一个即可。
2、allOf代表所有的类型都要匹配
满足allof数组中的所有条件。
3、oneOf只能满足其中一个,都不满足或者满足一个以上都会报错
4、not 和非一个意思,即不满足not指定的类型,校验就可以通过。
条件判断
直接上例子,如下:
如图13所示,if为条件语句,if正确即校验then语句,if不正确校验else语句。图中因为a的数据是b,所以res的数据必须是bbb,反之就是ccc。
此语法没有if else语句,所以如果想要进行多个条件的判断可以和allOf配合使用如下:
公共部分引用
对于一些重复的校验类型可以提取公共的部分,使用关键字definitions,如下:
引用的时候使用$ref关键字,如果是在本文件定义的公共部分,直接用#/definitions/属性 即可。
如果是外部文件,也可以是相对或者绝对的URI地址。
几个特殊关键字
1、$schema属性可以声明使用的schema版本,也可当做schema的标识,因为schema本身也是json,有了这个属性,就代表它不是一个普通的json而是schema。
2、title属性标识一下名称;
3、description属性对schema做详细的描述;
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/product.schema.json",
"title": "Product",
"description": "A product in the catalog",
"type": "object"
}
上面代码块中有一个关键字$id,它有什么用呢?
一是为了唯一标识这个schema,二是为$ref提供base路径。以上面的代码块为例,如果$ref的值是person.json,那么引用的整个路径就是
http://example.com/person.json。
总结
这个文章就是教大家如何配json schema,下一篇文章会说如何校验。
附一个在线校验地址:
https://jsonschemalint.com/#!
/version/draft-07/markup/json
喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!
猜你喜欢
- 2025-05-24 前端人必看!10 个实战优化技巧,让项目性能直接起飞!
- 2025-05-24 使用 nginx 同域名下部署多个 vue 项目,并使用反向代理
- 2025-05-24 React 组件频繁重绘?5 个实战技巧让页面流畅度暴涨 70%!
- 2025-05-24 前端踩坑血泪史!5 个 TypeScript 实战技巧拯救你的代码
- 2025-05-24 安装Node.js
- 2025-05-24 【HarmonyOS Next之旅】兼容JS的类Web开发(一)
- 2025-05-24 什么,你还使用 webpack?别人都在用 vite 搭建项目了
- 2025-05-24 微信百度字节小程序包过大解决方案(实战经验总结)
- 2025-05-24 从 Element UI 源码的构建流程来看前端 UI 库设计
- 2025-05-24 Tree Shaking 原理:如何让 JavaScript 包体积减少高达50%?
- 05-25β晶型PPH管压力等级的确定
- 05-25β晶型PPH管防静电参数
- 05-25魔兽WLK:P3五人本测试结果,冠军试炼加入观星者,掉落毕业饰品
- 05-25几滴血就能检测阿尔茨海默病?日本推出全球首款血液检测阿尔茨海默病装置
- 05-25日解析阿尔茨海默病致病蛋白构造
- 05-25抗菌药物皮试有讲究
- 05-258 周绒毛密度达 22 根 /cm^2,β-catenin 信号通路全解析
- 05-25《拳皇15》PS5/PS4平台开放性β测试用Demo上架商店
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)