什么是 JSON
JSON 在前端日常开发中再熟悉不过,往往我们和后端的数据交互都是通过 JSON 来进行传输的。那么具体什么是 JSON 呢?
JSON(JavaScript Object Notation, JS 对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的 js 规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
简单来说就是:
- JSON 指的是 JavaScript 对象标记法(JavaScript Object Notation)
- JSON 是一种轻量级的数据交换格式
- JSON 具有自我描述性且易于理解
- JSON 独立于语言*
什么是 JSON Schema
JSON Schema,从字面我们就可以知道,它和 JSON 有紧密的关系。那么具体是什么呢?
JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.
JSON Schema 可以称为 JSON 模式,是一个提议的 IETF 标准,它可以用来描述和校验你的 JSON 数据。JSON Schema 定义了一套词汇和规则,这套词汇和规则用来定义 JSON 元数据,且元数据也是通过 JSON 数据形式表达的。JSON 元数据定义了 JSON 数据需要满足的规范,规范包括成员、结构、类型、约束等。我们可以通过它来校验我们的 JSON 数据是否有效,是否满足规范。它的作用有些类似于 TypeScript 之于 JavaScript。
它的主要作用:
- 对 JSON 数据格式进行描述
- 提供清晰的人机可读的文档
校验数据
- 自动测试
- 验证提交数据的质量
JSON Schema 示例
假定我们现在有一个 JSON 数据:
{
"productId": 1,
"productName": "A green door",
"price": 12.50,
"tags": [ "home", "green" ]
}
我们来对应声明一个 JSON Schema 如下:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/product.schema.json",
"title": "Product",
"description": "A product",
"type": "object",
"properties": {
"productId": {
"description": "The unique identifier for a product",
"type": "integer"
},
"productName": {
"description": "Name of the product",
"type": "string"
},
"price": {
"description": "The price of the product",
"type": "number",
"exclusiveMinimum": 0
},
"tags": {
"description": "Tags for the product",
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
}
},
"required": [ "productId", "productName", "price" ]
}
JSON Schema 关键字
先让我们来看下开头的几个关键字:
$schema
关键字:用来声明当前 JSON Schema 使用的是哪个版本的 JSON Schema 标准,在声明 JSON Schema 时尽量添加上它,虽然它不是必须的。注:该关键字若使用,其值必须使用官方提供的值,不能自己随便写。$id
关键字:为JSON Schema实例声明了一个唯一标识符,并且可以用来声明一个解析$ref 的 URI 时的基础 URI。最佳实践是,每个顶级 JSON Schema 实例都应该将 $id 设置为一个由你自己控制的域内的绝对 URI。title
和description
关键字:仅用于描述性的作用,可以省略。type
关键字:用于验证 JSON 数据的第一个约束,在上述例子中,JSON 数据必须是一个对象。
上面几个关键字是针对 Schema 的一些设置和注释,针对对应的 JSON 数据中每个字段的描述,都在 properties 中,具体每种格式的字段相关的描述,我们稍后具体说明。让我们先看下最后一个关键字 required,它用来描述 JSON 数据中哪些字段是必须的,对应的值必须是数组格式。比如我们在更新文章时,提交的字段中文章 id 会是必须的;上面 JSON 数据中 productId 是必须的。
下面让我们具体看下 JSON 数据中不同类型的字段对应的描述关键字都有哪些。
JSON 数据中每个字段的描述都对应一个 type,type 对应的基本类型主要包括:
类型 | 描述 |
---|---|
string | 字符串型,双引号包裹的 Unicode 字符和反斜杠转义字符 |
number | 数字型,包括整型(int)和浮点数型(float) |
boolean | 布尔型,true 或 false |
object | 对象型,无序的键:值对集合 |
array | 数组型,有序的值序列 |
null | 空型 |
其中,针对类型 string、number、array 和 object 有一些相关的关键字:
string
关键字 描述 schema 有效值 json 数据验证 maxLength 最大长度 大于等于 0 的整数 字符串的长度必须小于等于该值 minLength 最小长度 大于等于 0 的整数 字符串的长度必须大于等于该值 pattern 模式 字符串,必须是有效的正则表达式 当字符串符合正则表达式时,通过验证 number
关键字 描述 Schema 有效值 json 数据验证 multipleOf 整数倍 大于 0 的 JSON 数 当 JSON 实例的值是其整数倍的时候,通过验证 maximum 最大值 一个 JSON 数 当 JSON 实例的值小于等于 maximum 的时候,通过验证 exclusiveMaximum 包含最大值 布尔值,必须与 maximum 一起使用 当其为 true 的时候,JSON 实例不能等于 maximum 的值 minimum 最小值 一个 JSON 数 当 JSON 实例的值大于等于 minimum 的时候,通过验证 exclusiveMinimum 包含最小值 布尔值,必须与 minimum 一起使用 当其为 true 的时候,JSON 实例不能等于 minimum 的值 array
关键字 描述 Schema 有效值 json 数据验证 items 定义元素 必须是 Schema 实例对象或者 Schema 实例对象的数组 用于定义 array 中的元素类型 additionalItems 额外项校验 布尔值或 Schema 实例对象 当 items 为 Schema 实例的数组,additionalItems 为 false 时,json 数据长度必须小于等于 items 长度,如果 additionalItems 是 Schema 实例,则 items 关键字指定的 Schema 实例数组没有匹配到的其他元素都要符合该实例 maxItems 长度限制 大于等于 0 的整数 array 实例的长度必须小于等于 maxItems 的值 minItems 长度限制 大于等于 0 的整数 array 实例的长度必须大于等于 minItems 的值 uniqueItems 唯一值 布尔值,默认值 false 当 uniqueItems 为 true 的时候,array 实例不能有重复值。 object
关键字 描述 Schema 有效值 json 数据验证 properties 属性 属性的值必须都是有效的 Schema 实例对象 用于定义属性列表 maxProperties 最大属性个数 大于等于 0 的整数 object 实例的属性个数必须小于等于 maxProperties 的值 minProperties 最小属性个数 大于等于 0 的整数 object 实例的属性个数必须大于等于 minProperties 的值 required 必须属性 字符串数组,至少必须有一个元素,数组内不能有重复值 object 实例必须有所有 required 定义的属性 patternProperties 按属性名校验 必须是有效的 Scheme 实例对象 Scheme 实例的每一个属性的键都是一个正则表达式,值都是一个 Schema 实例。 指定符合正则表达式的属性的校验规则。 additionalProperties 额外属性校验 Scheme 实例对象或布尔值 为 false 时不允许拥有除了 properties 和 patternProperties 匹配到的属性外的属性,如果为 Scheme 实例,则没有匹配到的属性要符合该 Scheme 另外,还有一些通用关键字
关键字 描述 Schema 有效值 json 数据验证 enum 数据枚举 必须是数组,而且数组里面的元素至少必须有一个而且不能有重复值。 当 json 实例的值存在于 enum 列表中时,通过验证 type 定义类型 可以是字符串或者字符串数组,取值必须在 JSON 基本类型范围内 校验 JSON 实例的类型是否符合定义 allOf 数据验证 必须是 Schema 实例对象数组,而且数组里面的元素至少必须有一个而且不能有重复 JSON 实例满足其中所有的 Schema 时,通过验证 anyOf 数据验证 同 allOf JSON 实例满足其中某一个 Schema 时,通过验证 oneOf 数据验证 同 allOf JSON 实例刚好只满足其中某一个 Schema 时,通过验证 not 数据验证 必须是个有效的 Schema 实例对象 如果不满足 JSON Schema 的定义,则通过验证 const 数据验证 JSON 基本类型 如果 JSON 实例的值和该关键字指定的值相同,则通过校验。
小结
本次我们主要是初步了解了 JSON Schema 和 JSON 的关系,以及 JSON Schema 的一些基础内容。JSON Schema 的构成主要依托于一些关键字,以此来确定一个 JSON 的数据结构描述。看到这里,可能我们还没有体会到它的作用,我们会在后续具体来看一下它是如何发挥作用,在哪些场景下为我们提供便利的,敬请期待。
参考:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。