本文作者:IMWeb 孙世吉 原文出处:IMWeb社区 未经同意,禁止转载
JSON 模式(JSON Schema)是一种基于 JSON 格式定义 JSON 数据结构的规范。其用于:
表现形式上来说 JSON Schema实际上也还是JSON数据。
JSON Schema制定了一系列规范,使得我们可以使用它来定义JSON数据的格式。
这有点像我们先定义了“语言”是什么怎么用,然后可以用“语言”来规定什么是诗词歌赋。“诗词歌赋”以及“诗词歌赋的定义”实际上也都还是“语言”。
简单来说,我们有JSON数据①,我们可以定义JSON数据②用来描述①的结构。这时候JSON数据②也就是JSON Schema,它可以描述以及验证JSON数据①。
JSON数据①:
{
"name": "shijisun",
"age": 24,
"gender": "male"
}
JSON数据②(JSON Schema):
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 4
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 130
},
"gender": {
"type": "string",
"enum": [
"male",
"female"
]
}
}
}
如上所示,JSON数据②描述JSON数据①:
1、是一个json对象,有三个属性:name、age和gender;
2、name属性的值是一个字符串,最小长度4;
3、age属性的值是一个整形数,最小值0.最大值130;
4、gender属性的值是一个字符串,只能取“male”或者“female”
JSON数据有两种结构:object和array
而object和array中的value可以取到如下几种类型的值。
本节说明怎么使用Schema描述上述类型与结构。
JSON Schema为json值定义了7种基本类型,基本与JSON定义一致:
类型 | 描述 |
---|---|
boolean | A JSON boolean. |
integer | A JSON number without a fraction or exponent part. |
number | Any JSON number. Number includes integer. |
string | A JSON string. |
object | A JSON object. |
array | A JSON array. |
null | The JSON null value. |
一个最简单的JSON Schema实例:
{
"type": SchemaType
}
其中SchemaType是JSON Schema支持的基本类型,例如 "boolean"。
使用Schema定义一个类型为boolean、integer、number、string或null的json数据。
Schema:
{
"type": "integer"
}
示例数据:
12345
上面描述了一个值为整型数的json数据,同理只要使用2.1说明的其他类型替换type字段的内容即可用于定义其他类型。
Schema:
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"age": {
"type": "integer"
},
"gender": {
"type": "string"
}
}
}
示例数据:
{
"id": 12345,
"name": "shijisun",
"age": 24,
"gender": "male"
}
例如:在上述例子中,定义object下有一个值为integer类型的属性“id”
Schema:
{
"type": "array",
"items": {
"type": "string"
}
}
示例数据:
[
"hello",
"world",
"!"
]
如果以 {{Schema}} 表示定义的JSON Schema实例,例如2.2.3中列举的都是Schema实例。 那么JSON Schema的嵌套定义规则可以表示成下面的形式:
{
"type": "object",
"properties": {
"key1": {{Schema}},
"key2": {{Schema}}
}
}
{
"type": "array",
"items": {{Schema}}
}
你会发现这与JSON的定义是一致的。
JSON的定义 | JSON Schema的定义 |
---|---|
object | type为object的 JSON Schema 实例,使用properties属性声明key值与value类型 |
array | type为array的 JSON Schema 实例,使用items属性声明value类型 |
value | 任意 JSON Schema 实例 |
我们可以使用JSON Schema描述所有可能出现的JSON数据结构
在上文我们已经可以使用JSON Schema描述现有JSON数据的格式了,但是你会发现我们可以定义object里面有什么属性,各个属性是什么类型;array里面的是什么类型的数据。但是我们还未对具体的数据进行限制,例如字符串的长度,整型数的取值范围,数组的长度等。
而JSON Schema实际上也定义了这些规范,以下列举了部分JSON Schema定义的用于数据验证的关键字。
注:下面的描述中,跟Schema有效性相关的实例一般指JSON Schema实例,与json数据验证相关的实例一般指JSON数据实例。
关键字 | 描述 | Schema有效值 | 用途 |
---|---|---|---|
title | 标题 | 字符串 | 描述信息 |
description | 描述 | 字符串 | 更加详尽的描述信息 |
default | 默认值 | 无限制 | 定义默认值 |
关键字 | 描述 | Schema有效值 | json数据验证 |
---|---|---|---|
enum | 数据枚举 | 必须是数组,而且数组里面的元素至少必须有一个而且不能有重复值。 | 当json实例的值存在于enum列表中时,通过验证 |
type | 定义类型 | 可以是字符串或者字符串数组,取值必须在Schema基本类型范围内 | |
allOf | 数据验证 | 必须是object Schema实例数组,而且数组里面的元素至少必须有一个而且不能有重复 | JSON实例满足其中所有的Schema时,通过验证 |
anyOf | 数据验证 | 同allOf | JSON实例满足其中某一个Schema时,通过验证 |
oneOf | 数据验证 | 同allOf | JSON实例刚好只满足其中某一个Schema时,通过验证 |
not | 数据验证 | 必须是一个object,而且是个有效的JSON Schema | 如果不满足JSON Schema的定义,则通过验证 |
definitions | 定义子模式 | 必须是一个object,object下所有属性的值都必须是有效的JSON Schema | 用于定义子模式 |
关键字 | 描述 | Schema有效值 | json数据验证 |
---|---|---|---|
multipleOf | 整数倍 | 大于0的JSON数 | 当JSON实例的值是其整数倍的时候,通过验证 |
maximum | 最大值 | 一个JSON数 | 当JSON实例的值小于等于maximum的时候,通过验证 |
exclusiveMaximum | 包含最大值 | 布尔值,必须与maximum一起使用 | 当其为true的时候,JSON实例不能等于maximum的值 |
minimum | 最小值 | 一个JSON数 | 当JSON实例的值大于等于minimum的时候,通过验证 |
exclusiveMinimum | 包含最小值 | 布尔值,必须与minimum一起使用 | 当其为true的时候,JSON实例不能等于minimum的值 |
以上关键字同时适用于integer和number
关键字 | 描述 | Schema有效值 | json数据验证 |
---|---|---|---|
maxLength | 最大长度 | 大于等于0的整数 | 字符串的长度必须小于等于该值 |
minLength | 最小长度 | 大于等于0的整数 | 字符串的长度必须大于等于该值 |
pattern | 模式 | 字符串,必须是有效的正则表达式 | 当字符串符合正则表达式时,通过验证 |
关键字 | 描述 | Schema有效值 | json数据验证 |
---|---|---|---|
items | 定义元素 | 必须是object或者array的Schema实例,如果是array则其元素也必须是object | 用于定义array中的元素类型 |
additionalItems | 长度限制 | 布尔值或类型为object的Schema实例 | 当items为array,additionalItems为false时,json数据长度必须小于等于items长度 |
maxItems | 长度限制 | 大于等于的整数 | array实例的长度必须小于等于maxItems的值 |
minItems | 长度限制 | 大于等于的整数 | array实例的长度必须大于等于minItems的值 |
uniqueItems | 唯一值 | 布尔值,默认值false | 当uniqueItems为true的时候,array实例不能有重复值。 |
关键字 | 描述 | Schema有效值 | json数据验证 |
---|---|---|---|
properties | 属性 | object,属性的值必须都是有效的Schema实例 | 用于定义属性列表 |
maxProperties | 最大属性个数 | 大于等于的整数 | object实例的属性个数必须小于等于maxProperties的值 |
minProperties | 最小属性个数 | 大于等于的整数 | object实例的属性个数必须大于等于minProperties的值 |
required | 必须属性 | 字符串数组,至少必须有一个元素,数组内不能有重复值 | object实例必须有所有required定义的属性 |
dependencies | 定义依赖 | object,属性对应的值必须是object或者字符串数组。 | - |
dependencies中定义的(name, schema)
模式依赖:name对应的JSON值必须也满足schema的定义;
dependencies中定义的(name, propertyset)
属性依赖:如果JSON实例拥有对应的属性名name,则也必须有name对应的propertyset数组内的所有属性名。
单独的结构验证可能不足以验证一个实例是否满足应用程序的所有要求。
format
关键字对值的固定子集进行可互操作的语义验证。
这些子集已经被权威机构进行准确的描述,例如data-time、mail、hostname、ipv4等。
生成JSON Schema在线工具