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,
}
})
}
}








网友评论