Json Schema 是什么?
阅读原文时间:2023年07月08日阅读:2

本文地址:Json Schema 是什么?

简单说,Json Schema 其实就是一个标准的 Json 串,它以一个 Json 串来描述我们需要的数据规范,并且支持注释以及验证 Json 文档,即我们可以用 Json Schema 来验证所给的 Json 串是否满足我们需要的数据格式规范。

同样能用来表示数据的还有一种格式 XML,为什么 Json Schema 偏偏要用 Json 来进行表示数据呢?对于机器,其实这两种方式是没有区别的,机器只要你把标准给了它,它都能用很快的速度识别出来(相对于我们人),但是 XML 对于人识别就太不友好了。比如,假设我们需要描述一个班级的两个人:

对于 XML:

<class>
    <name>实验1班</name>
    <no>1801</no>
    <students>
        <student>
            <name>张三</name>
            <sex>女</sex>
        </student>
        <student>
            <name>李四</name>
            <sex>男</sex>
        </student>
    </students>
</class>

使用 Json:

{
  "class": {
    "name": "实验1班",
    "no": "1801",
    "students": {
      "student": [
        {
          "name": "张三",
          "sex": "女"
        },
        {
          "name": "李四",
          "sex": "男"
        }
      ]
    }
  }
}

有没有觉得 Json 立马秒杀 XML?这里可能感觉还不是很明显,这是因为层级比较少,层级再多之后,Json 的优势立马就显现出来了。

Json Schema 在我们平时的工作中最常用的有两个,一个就是上面说的用于验证 Json 串的合法性;另一个就是用于定义我们的 API,定义好 API 后,我们可以直接用工具生成我们的 API,这样利于我们对 API 的维护。

比如,我们定义的 Json Schema 为:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from Acme's catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"]
}

在上述 Json Schema 中

  • 最上面的 $shcema 是一个关键字,它表示我们所定义的 Schema 和 http://json-schema.org/draft-04/schema#(Json Schema 的 v4 规范)是一致的
  • title 指的是标题。
  • description 用于描述我们所定义的 Schema,上述表明我们定义的是一个来自 Acme 目录的商品。
  • type 表示我们定义的是一个 object 对象。
  • properties 中就是 Schema 的属性了,这里面的是核心。我们可以看到该 Schema 一共有三个属性,分别是 id(integer), name(string), prince(number)
  • 最后的 required 表明三个属性都是必须的。

给定了上述 Schema,我们就可以验证给定的 Json 是否是合规的了。比如:

{
  "id": 1,
  "name": "watermelon"
}

显然,这个 Json 缺少了一个属性 price,所以它不合规。

{
  "id": 1,
  "name": ["knife", "spoon"],
  "price": 4
}

这个 Json 的 name 属性是一个数组,我们上面规定 name 只能是 String,显然这个也不是合规的。

{
  "id": 1,
  "name": "watermelon",
  "price": 4
}

这个,就满足了上面定义的所有规则,因此这个是一个合规的 Json。

其实,使用我们上面的 Json Schema 便能进行 API 的定义了,只不过是定义 API 的话可能还需要更多的支持。比如,对于 Java,我们需要能实现 extend 等关键字的支持,还需要能进行枚举 enum 类型等的定义。这里只简单使用上述的内容显然不够了,我们还需要扩充一些关键字的使用。

目前,大家使用最多的将 Json Schema 转换为 Java Bean 的一个库是 jsonschema2pojo,后面我将依托这个库支持的内容对 Json Schema 的格式进行深入解析,此库支持的也是比较通用的。