简介
JSON Schema 是基于 JSON 格式, 用于定义 JSON 数据结构以及校验 JSON 数据内容.
JSON Schema 官网地址: http://json-schema.org/
JsonSchema 类似于 xml 的 schema 和 DTD 的作用, 主要是用来规范 JSON 的格式.
关键字及其描述
关键字 | 描述 |
---|---|
$schema | 表示该 JSON Schema 文件遵循的规范 |
title | 为该 JSON Schema 文件提供一个标题 |
description | 关于该 JSON Schema 文件的描述信息 |
type | 表示待校验元素的类型(例如,最外层的 type 表示待校验的是一个 JSON 对象,内层 type 分别表示待校验的元素类型为,整数,字符串,数字) |
properties | 定义待校验的 JSON 对象中,各个 key-value 对中 value 的限制条件 |
requiredv | 定义待校验的 JSON 对象中,必须存在的 key |
minimum | 用于约束取值范围,表示取值范围应该大于或等于 minimum |
exclusiveMinimum | 如果 minimum 和 exclusiveMinimum 同时存在,且 exclusiveMinimum 的值为 true,则表示取值范围只能大于 minimum |
maximum | 用于约束取值范围,表示取值范围应该小于或等于 maximum |
exclusiveMaximum | 如果 maximum 和 exclusiveMaximum 同时存在,且 exclusiveMaximum 的值为 true,则表示取值范围只能小于 maximum |
multipleOf | 用于约束取值,表示取值必须能够被 multipleOf 所指定的值整除 |
maxLength | 字符串类型数据的最大长度 |
minLength | 字符串类型数据的最小长度 |
pattern | 使用正则表达式约束字符串类型数据 |
JSON Schema 关键字详解
JsonSchema 代码:
- {
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "TestInfo",
- "description": "some information about test",
- "type": "object",
- "properties": {
- "name": {
- "description": "Name of the test",
- "type": "string"
- },
- "age": {
- "description": "age of test",
- "type": "integer"
- }
- },
- "required": [
- "name"
- ]
- }
详细解释:
$schema: 用于指定 JSONSchema 的版本信息, 该值由官方提供, 不可乱写. 该关键字可以省略.
title: 当前 schema 的标题信息. 可以省略
description: 当前节点的描述
type: 当前节点的类型, 最外层 type 代表 JSON 的最外层是什么样的类型. 例如上方的例子中, 符合该 JsonSchema 的 JSON 数据必需是一个 JsonObject 而不能是一个 JsonArray
properties: 代表当前节点的子节点信息. 例如上方的例子中, 符合该 JsonSchema 的 JSON 数据的信息可以存在 "name" 节点和 "age" 节点. 按照上面的配置 required 信息来看, name 是必需要有的, 而 age 是非必需的.
required: 是一个数组类型, 代表当前节点下必需的节点 key. 例如上方例子中, 规定了 JSON 的格式必需要有 name 节点.
符合上述 JsonSchema 的 JSON 数据如下:
第一种 (不含有 age 节点, 只含有 name 一个节点或者 name 及其若干个节点):
- {
- "name": "upuptop"
- }
第二种 (含有 age 节点, age 节点的值必需为 integer 类型):
- {
- "name": "upuptop",
- "age": 123,
- "create_time": "2019-12-12"
- }
type 的常用取值
type 取值 | 对应的 python 数据类型 |
---|---|
object | Object |
array | List |
integer | int |
number | float 或 int |
null | None |
boolean | Boolean |
string | String |
关键字详解
最外层 type 为 object 时
properties
该关键字的值是一个对象.
用于指定 JSON 对象中的各种不同 key 应该满足的校验逻辑, 如果待校验 JSON 对象中所有值都能够通过该关键字值中定义的对应 key 的校验逻辑,
每个 key 对应的值, 都是一个 JSON Schema, 则待校验 JSON 对象通过校验.
从这里, 我们可以看到, 只要待校验 JSON 对象的所有 key 分别都通过对应的 JSON Schema 的校验检测, 这个对象才算是通过校验.
- "properties": {
- "name": {
- "description": "姓名必须由 2-3 个字组成",
- "type": "string",
- "maxLength": 3,
- "minLength": 2
- },
- "age": {
- "description": "年龄必须大于 18 岁. 并且不能超过 60 岁",
- "type": "integer",
- "minimum": 18,
- "maximum": 60
- }
- }
解释: 每个 key 对应的值, 都是一个 JSON Schema: 例如上方例子中, 每一个 key(name/age) 对应的值都是一个 JSONSchema,JSONSchema 中的关键字及描述都可以使用.
required
该关键字的值是一个数组, 而数组中的元素必须是字符串, 而且必须是唯一的.
该关键字限制了 JSON 对象中必须包含哪些一级 key.
如果一个 JSON 对象中含有 required 关键字所指定的所有一级 key, 则该 JSON 对象能够通过校验.
- "required": ["id","name","price"]
- minProperties,maxProperties
这两个关键字的值都是非负整数. 规定最多节点个数与最少节点个数.
指定了待校验 JSON 对象中一级 key 的个数限制, minProperties 指定了待校验 JSON 对象可以接受的最少一级 key 的个数, 而 maxProperties 指定了待校验 JSON 对象可以接受的最多一级 key 的个数.
另外, 需要注意的是, 省略 minProperties 关键字和该关键字的值为 0, 具有相同效果. 而, 如果省略 maxProperties 关键字则表示对一级 key 的最大个数没有限制. 例如, 如果限制一个 JSON 对象的一级 key 的最大个数为 5, 最小个数为 1, 则 JSON Schema 如下:
- "minProperties": 1,
- "maxProperties": 5
- patternProperties
该关键字的值是一个对象, 该 JSON 对象的每一个一级 key 都是一个正则表达式, value 都是一个 JSON Schema.
指定符合正则表达式的 key 的规则.
只有待校验 JSON 对象中的一级 key, 通过与之匹配的 patternProperties 中的一级正则表达式,
对应的 JSON Schema 的校验, 才算通过校验. 例如, 如果 patternProperties 对应的值如下
- "patternProperties": {
- "^a": {
- "type": "number"
- },
- "^b": {
- "type": "string"
- }
- }
上面的 JSON Schema 表示, 待校验 JSON 对象中, 所有以 a 开头的一级 key 的 value 都必须是 number, 所有以 b 开头的一级 key 的 value 都必须是 string.
additionalProperties
该关键字的值是一个 JSON Schema.
如果待校验 JSON 对象中存在, 既没有在 properties 中被定义, 又没有在 patternProperties 中被定义, 那么这些一级 key 必须通过 additionalProperties 的校验.
最外层 type 为 array 时
items:
该关键字的值是一个有效的 JSON Schema 或者一组有效的 JSON Schema.
当该关键字的值是一个有效的 JSON Schema 时, 只有待校验 JSON 数组中的所有元素均通过校验, 整个数组才算通过校验. 例如, 如果 items 关键字的具体定义如下:
- {
- "type": "array",
- "items": {
- "type": "string",
- "minLength": 5
- }
- }
- {
- "type": "array",
- "items": [
- {
- "type": "string",
- "minLength": 5
- },
- {
- "type": "number",
- "minimum": 10
- },
- {
- "type": "string"
- }
- ]
- }
- ["green", 10, "good"]
- ["helloworld", 11]
- ["green", 9, "good"]
- ["good", 12]
- additionalItems
- {
- "type": "array",
- "items": [
- {
- "type": "string",
- "minLength": 5
- },
- {
- "type": "number",
- "minimum": 10
- }
- ],
- "additionalItems": {
- "type": "string",
- "minLength": 2
- }
- }
- ["green", 10, "good"]
- ["green", 11]
- ["green", 10, "good", "ok"]
- ["green", 10, "a"]
- ["green", 10, "ok", 2]
- minItems,maxItems
- "minItems": 1,
- "maxItems": 5
- uniqueItems
- {
- "type": "integer",
- "multipleOf": 2
- }
- {
- "type": "number",
- "multipleOf": 2.0
- }
- {
- "type": "number",
- # 设定 maximum 为 12.3 则传入值必须小于 12.3
- # "maximum": 12.3,
- # 设定 exclusiveMaximum 为 12.3 则传入值是小于等于 12.3
- "exclusiveMaximum": 12.3
- }
- minimum,exclusiveMinimum
- {
- "type": "string",
- "format": "email"
- }
- {
- "type": "number",
- "enum": [2, 3, null, "hello"]
- }
- const
- {
- "$schema": "http://json-schema.org/draft-07/schema#",
- "properties": {
- },
- "dependencies": {
- "age": [
- "name"
- ]
- },
- }
- "warehouseLocation": {
- "description": "Coordinates of the warehouse where the product is located.",
- "$ref": "https://example.com/geographical-location.schema.json"
- }
- {
- "$schema": "http://json-schema.org/draft-07/schema#",
- "type": "object",
- "properties": {
- "foo": {
- "type": "string"
- },
- "bar": {
- "type": "string"
- }
- },
- "if": {
- "properties": {
- "foo": {
- "enum": [
- "bar",
- "123"
- ]
- }
- },
- "required": [
- "foo"
- ]
- },
- "then": {
- "required": [
- "bar"
- ]
- },
- "else": {
- "required": [
- "cc"
- ]
- }
- }
- {
- "foo": "bar22",
- "cc": 123
- }
- {
- "foo": "bar",
- "bar": "123"
- }
来源: https://www.cnblogs.com/upuptop/p/12034759.html