Json Schema
2020-12-22 本文已影响0人
欢欣的膜笛
Json Schema
定义了一系列关键字,元数据通过这些关键字来描述 Json
数据的规范。
-
type
:定义了Json
数据需要满足的类型要求
string , object , number(数值,不区分整数、浮点数), integer(整数) , array , boolean , null
-
字符串
-
minLength
,maxLength
:字符串长度 -
pattern
:正则表达式 -
format
:可以通过Json Schema
内建的一些类型,对字符串的格式做规范,例如电子邮件、日期、域名等。date, time, date-time, email, hostname
-
-
数值
-
multipleOf
:数值满足倍数 -
minimum, maximum, exclusiveMinimum, exclusiveMaximum
:数值范围,可以限制数值的方位,包括最大值、最小值、开区间最大值、开区间最小值。
-
-
数组:
-
items
:对应嵌套的Json Schema
,要求数组内每个成员都是某种类型、对应数组,约束数组的每个成员的类型 -
additionalItems
:boolean
,当使用了items
关键字且对应的是Schema
数组,这个限制才起作用。关键字additionalItems
规定Json
数组内的元素,除了一一匹配items
数组内的Schema
外,是否还允许多余的元组。 -
minItems, maxItems
:数组元素个数 -
uniqueItems
:数组元素是否必须唯一
-
-
对象:
-
properties
:规定对象各成原所应遵循的Schema
,是一个key/value
结构的字典,其key
对应Json
数据中的key
,其value
是一个嵌套的Json Schema
。表示Json
数据中key
对应的值所应遵守的Json Schema
。 -
patternProperties
:批量定义成员Schema
,与properties
一样,但是key
通过正则表达式匹配属性名。 -
required
:数组,规定哪些对象成员是必须的。 -
dependencies
:规定某些成员的依赖成员,不能在依赖成员缺席的情况下单独出现,属于数据完整性方面的约束。是一个字典结构,key
是Json
数据的属性名,value
是一个数组。 -
additionaProperties
:是否允许额外属性。 -
minProperties, maxProperties
:属性个数的限制。
-
-
逻辑组合:
-
allOf
:满足allOf
数组中的所有Json Schema
。 -
anyOf
:满足anyOf
数组中的任意个Schema
。 -
oneOf
:满足且仅满足oneOf
数组中的一个Schema
,这也是与anyOf
的区别。 -
not
:告诉Json
不能满足not
所对应的Schema
。
-
-
复杂结构
$id , $ref
-
通用关键字
-
enum
:可以在任何json schema
中出现,其value
是一个list
,表示json
数据的取值只能是list
中的某个。 -
title,description,default,example
:只作为描述作用,不影响对数据的校验。
-
ajv
一个非常流行的 JSON Schema
验证工具。
安装:npm install ajv -S , npm install ajv-errors -S
使用:
import Ajv from 'ajv'
const ajv = new Ajv({ allErrors: true })
require('ajv-errors')(ajv)
const schema = {
// $schema: 'http://json-schema.org/schema#',
type: 'object',
required: ['userName', 'email', 'phone', 'password'],
properties: {
userName: {
type: 'string',
minLength: 4,
maxLength: 8,
errorMessage: {
minLength: '用户名不得少于四个字符',
maxLength: '用户名不得多于八个字符',
},
},
email: {
type: 'string',
// 会报错,原因暂未找到
// format: 'email',
// errorMessage: {
// format: '请输入正确的邮箱',
// },
},
phone: {
type: 'string',
pattern: '^1[0-9]{10}$',
errorMessage: {
pattern: '请输入正确的手机号',
},
},
password: {
type: 'string',
minLength: 4,
maxLength: 8,
errorMessage: {
minLength: '密码不得少于四个字符',
maxLength: '密码不得多于八个字符',
},
},
},
}
export {
ajv,
schema,
}
const data = {
userName: '',
email: '',
phone: '',
password: '',
}
const errorMsgObj = {}
const login = () => {
const valid = ajv.validate(schema, data)
if (!valid && ajv.errors && ajv.errors.length) {
ajv.errors.forEach(item => {
const key = item.dataPath.substr(1) as string
errorMsgObj[key] = {
isError: true,
message: item.message,
}
})
}
}