# JSON Schema 入门介绍及应用
# 简介
JSON(JavaScript Object Notation),是一种数据格式,具有简洁、可读性高、支持广泛的特点。
JSON Schema 是基于JSON格式,用于定义 JSON 数据结构以及校验 JSON 数据内容。JSON Schema 官网地址 (opens new window)
栗子:
有 JSON 数据:
{
"name": "蕾某",
"birthday": "02-02",
"height": "154cm"
}
2
3
4
5
通过 JSON Schema 描述:
{
"type": "object",
"properties": {
"name": { "type": "string" },
"birthday": { "type": "string", "format": "date" },
"height": { "type": "string" }
}
}
2
3
4
5
6
7
8
通过上面我们可以看到,使用 JSON Schema 可以清晰的对 JSON 数据进行描述,因此非常适合拿来对数据进行校验。比如自定义表单数据的验证(ajv (opens new window)),或者使用 JSON Editor (opens new window) 的时候验证输入的数据。
# 关键字
关键字 | 描述 |
---|---|
$schema | 表示该JSON Schema文件遵循的规范(可选,最新 2019-09 ) |
title | 为该JSON Schema文件提供一个标题(可选) |
description | 关于该JSON Schema文件的描述信息(可选) |
type | 表示待校验元素的类型(例如,最外层的type表示待校验的是一个JSON对象,内层type分别表示待校验的元素类型为,整数,字符串,数字) |
properties | 定义待校验的JSON对象中,各个key-value对中value的限制条件 |
required | 定义待校验的JSON对象中,必须存在的key |
pattern | 使用正则表达式约束字符串类型数据 |
enum | 可以在任何类型使用,value 是一个数组,表示 JSON 数据的取值是数组中的某个 |
type
是核心,所有的验证都是基于它的。可选 string
,number
,integer
,object
,array
,null
,boolean
。
# string
可用关键字:maxLength、minLength、pattern、format、enum
# 1. 指定 string
类型
{ "type": "string" }
"蕾某" // ok
154 // not ok
"154" // ok
2
3
# 2. 包含多个类型
{ "type": ["string", "number"] }
"蕾某" // ok
154 // ok
"154" // ok
2
3
# 3. 限定字符串长度
{
"type": "string",
"minLength": 2,
"maxLength": 3
}
2
3
4
5
"蕾" // not ok
"蕾某" // ok
"154" // ok
"02-02" // not ok
2
3
4
# 4. 正则匹配
{
"type": "string",
"pattern": "^[0-9]{2}.[0-9]{2}$"
}
2
3
4
"蕾某" // not ok
"154" // not ok
"02-02" // ok
2
3
# 5. 枚举
{
"type": "string",
"enum": ["蕾某", "蕾"]
}
2
3
4
"蕾某" // not ok
"蕾" // ok
"154" // not ok
2
3
# 6. 内置验证
支持 date-time
,time
,date
,email
,hostname
,ipv4
,ipv6
,uri
,uri-reference
,regex
{
"type": "string",
"format": "date"
}
2
3
4
"蕾某" // not ok
"2020-08-27" // ok
"02-02" // not ok
2
3
# number
可用关键字:multipleOf、maximum、exclusiveMaximum、minimum、exclusiveMinimum
{ "type": "number" }
, 数值类型,可以是整数,也可以是浮点数;
{ "type": "integer" }
, 整数类型的 number;
{
"type": "number",
"multipleOf": 10,
"minimum": 10,
"maximum": 100,
"exclusiveMaximum": true
}
2
3
4
5
6
7
154 // not ok,因为 multipleOf ,不能被 10 整除
10 // ok,因为 minimum ,最小值 10
100 // not ok,因为 exclusiveMaximum ,不包含最大值 100
2
3
# 6.
# object
可用关键字:properties、required、minProperties、maxProperties、propertyNames、dependencies、patternProperties、additionalProperties
# 不允许有额外字段
{
"type": "object",
"properties": {
"name": { "type": "string" },
"birthday": { "type": "string" },
"height": { "type": "string" }
},
"additionalProperties": false
}
2
3
4
5
6
7
8
9
只能有 name
,birthday
,height
四个字段。
# 允许有额外字段并限定
{
"type": "object",
"properties": {
"name": { "type": "string" },
"birthday": { "type": "string" },
"height": { "type": "string" }
},
"additionalProperties": { "type": "string" }
}
2
3
4
5
6
7
8
9
可以有额外字段,但必须是 string
类型。
# 必填字段
{
"type": "object",
"properties": {
"name": { "type": "string" },
"birthday": { "type": "string" },
"height": { "type": "string" }
},
"required": ["name", "birthday"]
}
2
3
4
5
6
7
8
9
name
,birthday
必须有,允许有额外字段。
# 限定字段个数
{
"type": "object",
"properties": {
"name": { "type": "string" }
},
"minProperties": 2,
"maxProperties": 3
}
2
3
4
5
6
7
8
需要有 2~3 个字段,不能多,不能少。
# 批量定义字段
通过正则表达式匹配字段名。
{
"type": "object",
"patternProperties": {
"^S_": { "type": "string" },
"^I_": { "type": "integer" }
},
"additionalProperties": false
}
2
3
4
5
6
7
8
{ "S_25": "This is a string" } // ok
{ "I_0": 42 } // ok
{ "I_42": "This is a string" } // not ok
2
3
#
# 参考
← 滚动穿透 babel-basic →