1
头图

什么是 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数据验证同 allOfJSON 实例满足其中某一个 Schema 时,通过验证
    oneOf数据验证同 allOfJSON 实例刚好只满足其中某一个 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


前端荣耀
1.6k 声望745 粉丝

一个在程序猿修炼生涯中的修行者