Json Schema 是什么?

本文地址:Json Schema 是什么?git

简单说,Json Schema 其实就是一个标准的 Json 串,它以一个 Json 串来描述咱们须要的数据规范,而且支持注释以及验证 Json 文档,即咱们能够用 Json Schema 来验证所给的 Json 串是否知足咱们须要的数据格式规范。github

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

对于 XML:json

<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 的优点立马就显现出来了。ide

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

验证 Json 串的合法性

好比,咱们定义的 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 中ui

  • 最上面的 $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 是不是合规的了。好比:code

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

显然,这个 Json 缺乏了一个属性 price,因此它不合规。

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

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

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

这个,就知足了上面定义的全部规则,所以这个是一个合规的 Json。

定义 API

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

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

相关文章
相关标签/搜索