关于前端:2023我还不知道的JSON-Schema基础篇

2次阅读

共计 4170 个字符,预计需要花费 11 分钟才能阅读完成。

什么是 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。
  • titledescription 关键字:仅用于描述性的作用,能够省略。
  • 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 的数据结构形容。看到这里,可能咱们还没有领会到它的作用,咱们会在后续具体来看一下它是如何发挥作用,在哪些场景下为咱们提供便当的,敬请期待。


参考:

1.JSON Schema 入门

2.JSON Schema Reference

3. 在线 JSON 转 JSON Schema

正文完
 0